home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / src / td01_src.lha / td_r0.1 / source / td.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-20  |  237.3 KB  |  8,919 lines

  1. /*
  2. **      $VER: td.c 0.1 (20.6.99)
  3. **
  4. **      Creation date     : 11.4.1999
  5. **
  6. **      Description       :
  7. **         td library.
  8. **
  9. **
  10. **      Written by Stephan Bielmann
  11. **
  12. */
  13.  
  14. /*************************** Includes *******************************/
  15.  
  16. /*
  17. ** ANSI standart includes
  18. */
  19. #include <string.h>
  20. #include <math.h>
  21.  
  22. /*
  23. ** Amiga includes
  24. */
  25. #include <exec/types.h>
  26. #include <exec/memory.h>
  27. #include <dos/stdio.h>
  28. #include <dos/exall.h>
  29.  
  30. #include <clib/dos_protos.h>
  31. #include <clib/alib_stdio_protos.h>
  32.  
  33. #include <pragma/exec_lib.h>
  34.  
  35. /*
  36. ** Project includes
  37. */
  38. #include "td_private.h"
  39. #include "compiler.h"
  40. #include "pragma/x3_lib.h"
  41. //#include "include/td/tdbase.h"
  42.  
  43. /*************************** Defines ********************************/
  44.  
  45. #define EXALLBUFFERSIZE 2048    // Buffer size for exall dir scan
  46.  
  47. /********************** Private constants ***************************/
  48.  
  49. /*
  50. ** The library information structure
  51. */
  52. TDlibraryinfo *tdlibinfos=NULL;
  53.  
  54. /*
  55. ** The supported file format arrays
  56. */
  57. static STRPTR     *c3dsLib=NULL;
  58. static STRPTR    *c3dsNames=NULL;
  59. static STRPTR    *c3dsExt=NULL;
  60. static STRPTR     *c3dlLib=NULL;
  61. static STRPTR    *c3dlNames=NULL;
  62.  
  63. //!!!!!!!!!!!!! alles in base !! globales zeug !!!!!!!!!!!!!!!!!!
  64.  
  65. //dummi hummi
  66. /*
  67. static ULONG c3dFFIDs [] = { 0 };
  68.  
  69. static STRPTR  c3dFFLib [] = {
  70.     "dxf.library",
  71.     NULL
  72. };
  73.  
  74. static STRPTR c3dFFNames [] = {
  75.     "AutoCAD DXF",
  76.     NULL
  77. };
  78.  
  79. static STRPTR c3dFFExtensions [] = {
  80.     "dxf",
  81.     NULL
  82. };
  83.  
  84. static ULONG  c2dFFIDs   [] = {
  85.     T2DFEPS,
  86.     0
  87. };
  88.  
  89. static STRPTR c2dFFNames [] = {
  90.     "Encapsulated PostScript",
  91.     NULL
  92. };
  93.  
  94. static STRPTR c2dFFExtensions [] = {
  95.     "eps",
  96.     NULL
  97. };
  98. */
  99.  
  100. /*
  101. ** The constant supported drawing mode arrays
  102. */
  103. static ULONG  cDMIDs   [] = {
  104.     DMPOINTS,
  105.     DMWIREBW,
  106.     DMWIREGR,
  107.     DMWIRECL,
  108.     DMHIDDBW,
  109.     DMHIDDGR,
  110.     DMHIDDCL,
  111.     DMSURFBW,
  112.     DMSURFGR,
  113.     DMSURFCL,
  114.     0
  115. };
  116.  
  117. static STRPTR  cDMNames   [] = {
  118.     "Points, black and white",
  119.     "Wireframe, black and white",
  120.     "Wireframe, gray scales",
  121.     "Wireframe, colors",
  122.     "Hidden line, black and white",
  123.     "Hidden line, gray scales",
  124.     "Hidden line, colors",
  125.     "Surface, black and white",
  126.     "Surface, gray scales",
  127.     "Surface, colors",
  128.     NULL
  129. };
  130.  
  131. /*
  132. ** Definition of PI
  133. */
  134. #define PI 3.14159265359
  135.  
  136. /********************** Global variables ****************************/
  137.  
  138. struct x3Base *x3Base = NULL;
  139.  
  140. /********************** Private functions ***************************/
  141.  
  142. /********************************************************************\
  143. *                                                                    *
  144. * Name         : addMaterialNode                                     *
  145. *                                                                    *
  146. * Description  : Add a new material node to the space.               *
  147. *                                                                    *
  148. * Arguments    : space  IN : Pointer to the space.                   *
  149. *                type   IN : Type of material.                       *
  150. *                                                                    *
  151. * Return Value : Index of the new material or 0 if no more memory.   *
  152. *                                                                    *
  153. * Comment      : The array indices are beginnning at 0, index at 1   *
  154. *                                                                    *
  155. \********************************************************************/
  156. static ULONG addMaterialNode(TDspace *space,TDenum type) {
  157.     TDmaterialnode        *mat=NULL;
  158.     TDsurface            *surf=NULL;
  159.     TDtexture            *tex=NULL;
  160.     UBYTE                buffer[100];
  161.     ULONG                matnode,matblock;
  162.     ULONG                realmat;
  163.     
  164.     // check if we have still place for a material node
  165.     matnode=(space->materials.numberOfMaterials)%Ci_MATNODESINBLOCK;
  166.     matblock=((space->materials.numberOfMaterials)-matnode)/Ci_MATNODESINBLOCK;
  167.  
  168.     // we are above our internal limit
  169.     if(matblock>=Ci_MATBLOCKS) return(0);
  170.  
  171.     // check if we have to allocate a new nodes list block
  172.     if(matnode==0) {
  173.         space->materials.blocks[matblock]=AllocPooled(space->matblockspool,sizeof(TDmaterialblock));
  174.         if(space->materials.blocks[matblock]==NULL) return(0);
  175.     }
  176.  
  177.     mat = AllocMem(sizeof(TDmaterialnode),MEMF_FAST);
  178.     if (mat==NULL) {
  179.         return(0);
  180.     }
  181.  
  182.     mat->name=NULL;
  183.     sprintf(buffer,"tdMAT%ld",space->materials.numberOfMaterials);
  184.     mat->name = AllocVec(strlen(buffer)+1,MEMF_FAST);
  185.     if (mat->name==NULL) {
  186.         FreeMem(mat,sizeof(TDmaterialnode));
  187.         return(0);
  188.     }
  189.     strcpy(mat->name,buffer);
  190.  
  191.     //create the desired type of material
  192.     switch(type) {
  193.         case TD_SURFACE :
  194.             surf=AllocVec(sizeof(TDsurface),MEMF_FAST);
  195.             if(surf!=NULL) {
  196.                 surf->ambientColor.r=0;
  197.                 surf->ambientColor.g=0;
  198.                 surf->ambientColor.b=0;
  199.                 surf->diffuseColor.r=0;
  200.                 surf->diffuseColor.g=0;
  201.                 surf->diffuseColor.b=0;
  202.                 surf->shininess=0;
  203.                 surf->transparency=0;
  204.  
  205.                 realmat=(ULONG)surf;
  206.             } else {
  207.                 realmat=0;
  208.             }
  209.             break;
  210.  
  211.         case TD_TEXTURE :
  212.             tex=AllocVec(sizeof(TDtexture),MEMF_FAST);
  213.             if(tex!=NULL) {
  214.                 realmat=(ULONG)tex;
  215.             } else {
  216.                 realmat=0;
  217.             }
  218.             break;
  219.  
  220.         default :
  221.             realmat=0;
  222.             break;
  223.     }
  224.  
  225.     if(realmat==0) {
  226.         FreeVec(mat->name);
  227.         FreeMem(mat,sizeof(TDmaterialnode));
  228.         return(0);
  229.     }
  230.  
  231.     mat->handle=realmat;
  232.     mat->type=type;
  233.  
  234.     // last increment the numberOfMaterials counter and index assignment
  235.     mat->index=++(space->materials.numberOfMaterials);
  236.  
  237.     // assign the node to the nodes list
  238.     space->materials.blocks[matblock]->nodes[matnode]=mat;
  239.  
  240.     return(mat->index);
  241. }
  242.  
  243. /********************************************************************\
  244. *                                                                    *
  245. * Name         : getMaterialNode                                     *
  246. *                                                                    *
  247. * Description  : Search the material its node with its index, in     *
  248. *                the given space. If the index is not valid, NULL    *
  249. *                will be returned.                                   *
  250. *                                                                    *
  251. * Arguments    : space          IN : Pointer to the space            *
  252. *                materialindex  IN : Material index                  *
  253. *                                                                    *
  254. * Return Value : Pointer to the material or NULL if not found.       *
  255. *                                                                    *
  256. * Comment      : The array indices are beginnning at 0, index at 1   *
  257. *                                                                    *
  258. \********************************************************************/
  259. static TDmaterialnode *getMaterialNode(TDspace *space, ULONG materialindex) {
  260.     ULONG matblock,matnode;
  261.  
  262.     // if we have materials, and the index is between 1 and numberOfMaterials
  263.     if(space->materials.numberOfMaterials==0) return(NULL);
  264.     if(materialindex<1 || materialindex>space->materials.numberOfMaterials) return(NULL);
  265.  
  266.     // internal index is index - 1
  267.     materialindex--;
  268.  
  269.     // compute the block and node and return the material node
  270.     matnode=materialindex%Ci_MATNODESINBLOCK;
  271.     matblock=(materialindex-matnode)/Ci_MATNODESINBLOCK;
  272.     return(space->materials.blocks[matblock]->nodes[matnode]);
  273. }
  274.  
  275. /********************************************************************\
  276. *                                                                    *
  277. * Name         : mul33Matrix                                         *
  278. *                                                                    *
  279. * Description  : Multiplicates two 3x3 matrix structures.            *
  280. *                                                                    *
  281. * Arguments    : m1  IN/OUT : The first matrix, contains the result  *
  282. *                m2  IN     : The second matrix.                     *
  283. *                                                                    *
  284. * Comment      :                                                     *
  285. *                                                                    *
  286. \********************************************************************/
  287. static VOID mulMatrix (double m1[3][3], double m2[3][3]) {
  288.     double m[3][3];
  289.     int x,y,yy;
  290.  
  291.     for(x=0;x<3;x++) {
  292.         for(y=0;y<3;y++) {
  293.             m[x][y]=0;
  294.         }
  295.     }
  296.  
  297.     for(x=0;x<3;x++) {
  298.         for(y=0;y<3;y++) {
  299.             for(yy=0;yy<3;yy++) {
  300.                 m[x][y]+=m1[yy][y]*m2[x][yy];
  301.             }
  302.         }
  303.     }
  304.  
  305.     m1[0][0]=m[0][0];
  306.     m1[1][0]=m[1][0];
  307.     m1[2][0]=m[2][0];
  308.     m1[0][1]=m[0][1];
  309.     m1[1][1]=m[1][1];
  310.     m1[2][1]=m[2][1];
  311.     m1[0][2]=m[0][2];
  312.     m1[1][2]=m[1][2];
  313.     m1[2][2]=m[2][2];
  314. }
  315.  
  316. /********************************************************************\
  317. *                                                                    *
  318. * Name         : translationChange                                   *
  319. *                                                                    *
  320. * Description  : Changes the translation in function of the operation*
  321. *                                                                    *
  322. * Arguments    : space        IN : Pointer to the space.             *
  323. *                 tvertex      IN : Vertex with coordinates.          *
  324. *                operation    IN : Operation to perform.             *
  325. *                                                                    *
  326. * Return Value : 0 if ok 1 if the operation is invalid.              *
  327. *                                                                    *
  328. * Comment      :                                                     *
  329. *                                                                    *
  330. \********************************************************************/
  331. static ULONG translationChange(TDspace *space,TDvectord tvertex, TDenum operation) {
  332.  
  333.     switch (operation) {
  334.         case TD_ADD :
  335.             space->ctm.m[3][0]+=tvertex.x;
  336.             space->ctm.m[3][1]+=tvertex.y;
  337.             space->ctm.m[3][2]+=tvertex.z;
  338.         break;
  339.         case TD_SUB :
  340.             space->ctm.m[3][0]-=tvertex.x;
  341.             space->ctm.m[3][1]-=tvertex.y;
  342.             space->ctm.m[3][2]-=tvertex.z;
  343.         break;
  344.         case TD_MUL :
  345.             space->ctm.m[3][0]*=tvertex.x;
  346.             space->ctm.m[3][1]*=tvertex.y;
  347.             space->ctm.m[3][2]*=tvertex.z;
  348.         break;
  349.         case TD_DIV :
  350.             if(tvertex.x!=0) space->ctm.m[3][0]/=tvertex.x;
  351.             else space->ctm.m[3][0]=0;
  352.             if(tvertex.y!=0) space->ctm.m[3][1]/=tvertex.y;
  353.             else space->ctm.m[3][1]=0;
  354.             if(tvertex.z!=0) space->ctm.m[3][2]/=tvertex.z;
  355.             else space->ctm.m[3][2]=0;
  356.         break;
  357.         case TD_SET :
  358.             space->ctm.m[3][0]=tvertex.x;
  359.             space->ctm.m[3][1]=tvertex.y;
  360.             space->ctm.m[3][2]=tvertex.z;
  361.         break;
  362.         case TD_RESET :
  363.             space->ctm.m[3][0]=0;
  364.             space->ctm.m[3][1]=0;
  365.             space->ctm.m[3][2]=0;
  366.             space->ctm.m[3][3]=1;
  367.         break;
  368.         default :
  369.             return(1);
  370.     }
  371.  
  372.     return(0);
  373. }
  374.  
  375. /********************************************************************\
  376. *                                                                    *
  377. * Name         : scaleChange                                         *
  378. *                                                                    *
  379. * Description  : Changes the scale in function of the operation      *
  380. *                                                                    *
  381. * Arguments    : space        IN : Pointer to the space.             *
  382. *                 svertex      IN : Vertex with coordinates.          *
  383. *                operation    IN : Operation to perform.             *
  384. *                                                                    *
  385. * Return Value : 0 if ok, 1 if the operation is not valid.           *
  386. *                                                                    *
  387. * Comment      :                                                     *
  388. *                                                                    *
  389. \********************************************************************/
  390. static ULONG scaleChange(TDspace *space,TDvectord svertex, TDenum operation) {
  391.  
  392.     switch (operation) {
  393.         case TD_ADD :
  394.             space->ctm.sx+=svertex.x;
  395.             space->ctm.sy+=svertex.y;
  396.             space->ctm.sz+=svertex.z;
  397.         break;
  398.         case TD_SUB :
  399.             space->ctm.sx-=svertex.x;
  400.             space->ctm.sy-=svertex.y;
  401.             space->ctm.sz-=svertex.z;
  402.         break;
  403.         case TD_MUL :
  404.             space->ctm.sx*=svertex.x;
  405.             space->ctm.sy*=svertex.y;
  406.             space->ctm.sz*=svertex.z;
  407.         break;
  408.         case TD_DIV :
  409.             if(svertex.x!=0) space->ctm.sx/=svertex.x;
  410.             else space->ctm.sx=0;
  411.             if(svertex.y!=0) space->ctm.sy/=svertex.y;
  412.             else space->ctm.sy=0;
  413.             if(svertex.z!=0) space->ctm.sz/=svertex.z;
  414.             else space->ctm.sz=0;
  415.         break;
  416.         case TD_SET :
  417.             space->ctm.sx=svertex.x;
  418.             space->ctm.sy=svertex.y;
  419.             space->ctm.sz=svertex.z;
  420.         break;
  421.         case TD_RESET :
  422.             space->ctm.sx=1;
  423.             space->ctm.sy=1;
  424.             space->ctm.sz=1;
  425.         break;
  426.         default :
  427.             return(1);
  428.     }
  429.  
  430.     return(0);
  431. }
  432.  
  433. /********************************************************************\
  434. *                                                                    *
  435. * Name         : rotationChange                                      *
  436. *                                                                    *
  437. * Description  : Changes the rotation in function of the operation   *
  438. *                                                                    *
  439. * Arguments    : space        IN : Pointer to the space.             *
  440. *                 rvertex      IN : Vertex with coordinates.          *
  441. *                operation    IN : Operation to perform.             *
  442. *                                                                    *
  443. * Return Value : 0 if ok, 1 if the operation is not valid.           *
  444. *                                                                    *
  445. * Comment      :                                                     *
  446. *                                                                    *
  447. \********************************************************************/
  448. static ULONG rotationChange(TDspace *space,TDvectord rvertex, TDenum operation) {
  449.     TDdouble    m1[3][3],m2[3][3];
  450.  
  451.     switch (operation) {
  452.         case TD_ADD :
  453.             space->ctm.rx+=rvertex.x;
  454.             space->ctm.ry+=rvertex.y;
  455.             space->ctm.rz+=rvertex.z;
  456.         break;
  457.         case TD_SUB :
  458.             space->ctm.rx-=rvertex.x;
  459.             space->ctm.ry-=rvertex.y;
  460.             space->ctm.rz-=rvertex.z;
  461.         break;
  462.         case TD_MUL :
  463.             space->ctm.rx*=rvertex.x;
  464.             space->ctm.ry*=rvertex.y;
  465.             space->ctm.rz*=rvertex.z;
  466.         break;
  467.         case TD_DIV :
  468.             if(rvertex.x!=0) space->ctm.rx/=rvertex.x;
  469.             else space->ctm.rx=0;
  470.             if(rvertex.y!=0) space->ctm.ry/=rvertex.y;
  471.             else space->ctm.ry=0;
  472.             if(rvertex.z!=0) space->ctm.rz/=rvertex.z;
  473.             else space->ctm.rz=0;
  474.         break;
  475.         case TD_SET :
  476.             space->ctm.rx=rvertex.x;
  477.             space->ctm.ry=rvertex.y;
  478.             space->ctm.rz=rvertex.z;
  479.         break;
  480.         case TD_RESET :
  481.             space->ctm.rx=0;
  482.             space->ctm.ry=0;
  483.             space->ctm.rz=0;
  484.         break;
  485.         default :
  486.             return(1);
  487.     }
  488.  
  489.     // If equal to 2*PI set to 0
  490.     if(space->ctm.rx==2*PI) space->ctm.rx=0;
  491.     if(space->ctm.ry==2*PI) space->ctm.ry=0;
  492.     if(space->ctm.rz==2*PI) space->ctm.rz=0;
  493.  
  494.     // Recalculating the CTM
  495.     m1[0][0]=1;
  496.     m1[1][0]=0;
  497.     m1[2][0]=0;
  498.     m1[0][1]=0;
  499.     m1[1][1]=1;
  500.     m1[2][1]=0;
  501.     m1[0][2]=0;
  502.     m1[1][2]=0;
  503.     m1[2][2]=1;
  504.  
  505.     m2[0][0]=cos(space->ctm.rz);
  506.     m2[1][0]=-sin(space->ctm.rz);
  507.     m2[2][0]=0;
  508.     m2[0][1]=sin(space->ctm.rz);
  509.     m2[1][1]=cos(space->ctm.rz);
  510.     m2[2][1]=0;
  511.     m2[0][2]=0;
  512.     m2[1][2]=0;
  513.     m2[2][2]=1;
  514.  
  515.     mulMatrix(m1,m2);
  516.  
  517.     m2[0][0]=cos(space->ctm.ry);
  518.     m2[1][0]=0;
  519.     m2[2][0]=sin(space->ctm.ry);
  520.     m2[0][1]=0;
  521.     m2[1][1]=1;
  522.     m2[2][1]=0;
  523.     m2[0][2]=-sin(space->ctm.ry);
  524.     m2[1][2]=0;
  525.     m2[2][2]=cos(space->ctm.ry);
  526.  
  527.     mulMatrix(m1,m2);
  528.  
  529.     m2[0][0]=1;
  530.     m2[1][0]=0;
  531.     m2[2][0]=0;
  532.     m2[0][1]=0;
  533.     m2[1][1]=cos(space->ctm.rx);
  534.     m2[2][1]=-sin(space->ctm.rx);
  535.     m2[0][2]=0;
  536.     m2[1][2]=sin(space->ctm.rx);
  537.     m2[2][2]=cos(space->ctm.rx);
  538.  
  539.     mulMatrix(m1,m2);
  540.  
  541.     space->ctm.m[0][0]=m1[0][0];
  542.     space->ctm.m[1][0]=m1[1][0];
  543.     space->ctm.m[2][0]=m1[2][0];
  544.     space->ctm.m[0][1]=m1[0][1];
  545.     space->ctm.m[1][1]=m1[1][1];
  546.     space->ctm.m[2][1]=m1[2][1];
  547.     space->ctm.m[0][2]=m1[0][2];
  548.     space->ctm.m[1][2]=m1[1][2];
  549.     space->ctm.m[2][2]=m1[2][2];
  550.  
  551.     return(0);
  552. }
  553.  
  554. /********************************************************************\
  555. *                                                                    *
  556. * Name         : getMatGroupNode                                     *
  557. *                                                                    *
  558. * Description  : Search the matgroup its node with its index, in     *
  559. *                the given mesh. If the index is not valid, NULL     *
  560. *                will be returned.                                   *
  561. *                                                                    *
  562. * Arguments    : mesh          IN : Pointer to the mesh.             *
  563. *                matgroupindex IN : Matgroup index.                  *
  564. *                                                                    *
  565. * Return Value : Pointer to the matgroup or NULL if not found.       *
  566. *                                                                    *
  567. * Comment      : The array indices are beginnning at 0, index at 1   *
  568. *                                                                    *
  569. \********************************************************************/
  570. static TDmatgroupnode *getMatGroupNode(TDpolymesh *mesh, ULONG matgroupindex) {
  571.     ULONG matgroupblock,matgroupnode;
  572.  
  573.     // if we have matgroups, and the index is between 1 and numberOfMatGroupss
  574.     if(mesh->matgroups.numberOfMatGroups==0) return(NULL);
  575.     if(matgroupindex<1 || matgroupindex>mesh->matgroups.numberOfMatGroups) return(NULL);
  576.  
  577.     // internal index is - 1
  578.     matgroupindex--;
  579.  
  580.     // compute the block and node and return the matgroup node
  581.     matgroupnode=matgroupindex%Ci_MATGROUPNODESINBLOCK;
  582.     matgroupblock=(matgroupindex-matgroupnode)/Ci_MATGROUPNODESINBLOCK;
  583.     return(mesh->matgroups.blocks[matgroupblock]->nodes[matgroupnode]);
  584. }
  585.  
  586. /********************************************************************\
  587. *                                                                    *
  588. * Name         : cleanPolyMesh                                       *
  589. *                                                                    *
  590. * Description  : If an error occurs while creating a new mesh, call  *
  591. *                this one to delete it.                              *
  592. *                                                                    *
  593. * Arguments    : mesh   IN : Pointer to the mesh.                    *
  594. *                                                                    *
  595. * Comment      :                                                     *
  596. *                                                                    *
  597. \********************************************************************/
  598. static VOID cleanPolyMesh(TDpolymesh *mesh) {
  599.  
  600.     DeletePool(mesh->vertexpool);
  601.     DeletePool(mesh->vertexarraypool);
  602.     DeletePool(mesh->vertexblockspool);
  603.     DeletePool(mesh->polyverpool);
  604.     DeletePool(mesh->polypool);
  605.     DeletePool(mesh->polyarraypool);
  606.     DeletePool(mesh->polyblockspool);
  607.     DeletePool(mesh->matgroupblockspool);
  608.     FreeMem(mesh,sizeof(TDpolymesh));
  609. };
  610.  
  611. /********************************************************************\
  612. *                                                                    *
  613. * Name         : newPolyMesh                                         *
  614. *                                                                    *
  615. * Description  : Creates and initializes a new polymesh.             *
  616. *                                                                    *
  617. * Return Value : Handle of the new mesh or 0 if no more memory.      *
  618. *                                                                    *
  619. * Comment      :                                                     *
  620. *                                                                    *
  621. \********************************************************************/
  622. static ULONG newPolyMesh() {
  623.     TDpolymesh    *mesh=NULL;
  624.  
  625.     mesh = AllocMem(sizeof(TDpolymesh),MEMF_FAST);
  626.     if (mesh==NULL) return(0);
  627.  
  628.     // initialize the pool headers and other pointers
  629.     mesh->vertexpool=NULL;
  630.     mesh->vertexarraypool=NULL;
  631.     mesh->vertexblockspool=NULL;
  632.     mesh->polyverpool=NULL;
  633.     mesh->polypool=NULL;
  634.     mesh->polyarraypool=NULL;
  635.     mesh->polyblockspool=NULL;
  636.     mesh->matgroupblockspool=NULL;
  637.  
  638.     mesh->curpolyn=NULL;
  639.     mesh->curmatgroupn=NULL;
  640.  
  641.     // create a memory pool for the vertices of this this mesh
  642.     // ground size of a pool is to get 100 vertices
  643.     mesh->vertexpool=CreatePool(MEMF_FAST,100*sizeof(TDvectord),100*sizeof(TDvectord));
  644.     if(mesh->vertexpool==NULL) {
  645.         cleanPolyMesh(mesh);
  646.         return(0);
  647.     }
  648.  
  649.     // create a memory pool for the vertex arrays of this this mesh
  650.     // ground size of a pool is to get one array of vertices
  651.     mesh->vertexarraypool=CreatePool(MEMF_FAST,sizeof(TDvertexarray),sizeof(TDvertexarray));
  652.     if(mesh->vertexarraypool==NULL) {
  653.         cleanPolyMesh(mesh);
  654.         return(0);
  655.     }
  656.  
  657.     // create a memory pool for the vertex blocks of this this mesh
  658.     // ground size of a pool is to get one block of vertex arrays
  659.     mesh->vertexblockspool=CreatePool(MEMF_FAST,sizeof(TDvertexblock),sizeof(TDvertexblock));
  660.     if(mesh->vertexblockspool==NULL) {
  661.         cleanPolyMesh(mesh);
  662.         return(0);
  663.     }
  664.  
  665.     // create a memory pool for the polygon vertex array of this this mesh
  666.     // ground size of a pool is to get one vertex in the array
  667.     mesh->polyverpool=CreatePool(MEMF_FAST,sizeof(ULONG),sizeof(ULONG));
  668.     if(mesh->polyverpool==NULL) {
  669.         cleanPolyMesh(mesh);
  670.         return(0);
  671.     }
  672.  
  673.     // create a memory pool for the polygons of this this mesh
  674.     // ground size of a pool is to get 100 polygons
  675.     mesh->polypool=CreatePool(MEMF_FAST,100*sizeof(TDpolygonnode),100*sizeof(TDpolygonnode));
  676.     if(mesh->polypool==NULL) {
  677.         cleanPolyMesh(mesh);
  678.         return(0);
  679.     }
  680.  
  681.     // create a memory pool for the polygon arrays of this this mesh
  682.     // ground size of a pool is to get one array of polygons
  683.     mesh->polyarraypool=CreatePool(MEMF_FAST,sizeof(TDpolygonarray),sizeof(TDpolygonarray));
  684.     if(mesh->polyarraypool==NULL) {
  685.         cleanPolyMesh(mesh);
  686.         return(0);
  687.     }
  688.  
  689.     // create a memory pool for the polygon blocks of this this mesh
  690.     // ground size of a pool is to get one block of polygon arrays
  691.     mesh->polyblockspool=CreatePool(MEMF_FAST,sizeof(TDpolygonblock),sizeof(TDpolygonblock));
  692.     if(mesh->polyblockspool==NULL) {
  693.         cleanPolyMesh(mesh);
  694.         return(0);
  695.     }
  696.  
  697.     // create a memory pool for the matgroup block lists of this this mesh
  698.     // ground size of a pool is one block of matgroups
  699.     mesh->matgroupblockspool=CreatePool(MEMF_FAST,sizeof(TDmatgroupblock),sizeof(TDmatgroupblock));
  700.     if(mesh->matgroupblockspool==NULL) {
  701.         cleanPolyMesh(mesh);
  702.         return(0);
  703.     }
  704.  
  705.     mesh->bBox.left=0.0;
  706.     mesh->bBox.right=0.0;
  707.     mesh->bBox.front=0.0;
  708.     mesh->bBox.rear=0.0;
  709.     mesh->bBox.top=0.0;
  710.     mesh->bBox.bottom=0.0;
  711.     
  712.     mesh->vertices.numberOfVertices=0;
  713.         
  714.     mesh->matgroups.numberOfMatGroups=0;
  715.     mesh->matgroups.numberOfPolygons=0;
  716.  
  717.     return(ULONG)mesh;
  718. }
  719.  
  720. /********************************************************************\
  721. *                                                                    *
  722. * Name         : delPolyMesh                                         *
  723. *                                                                    *
  724. * Description  : Deletes a polymesh and sub components.              *
  725. *                                                                    *
  726. * Arguments    : mesh  IN : Pointer to the mesh.                     *
  727. *                                                                    *
  728. \********************************************************************/
  729. static VOID delPolyMesh(TDpolymesh *mesh) {
  730.     TDmatgroupnode    *matgroup;
  731.     ULONG        i;
  732.  
  733.     /*
  734.     ** Free the vertices
  735.     */
  736.     DeletePool(mesh->vertexpool);
  737.     DeletePool(mesh->vertexarraypool);
  738.     DeletePool(mesh->vertexblockspool);
  739.  
  740.     /*
  741.     ** Free the polygons
  742.     */
  743.     DeletePool(mesh->polyverpool);
  744.     DeletePool(mesh->polypool);
  745.     DeletePool(mesh->polyarraypool);
  746.     DeletePool(mesh->polyblockspool);
  747.  
  748.     /*
  749.     ** Free the matgroups and the nodeslist
  750.     */
  751.     for(i=1;i<=mesh->matgroups.numberOfMatGroups;i++) {
  752.         matgroup=getMatGroupNode(mesh,i);
  753.  
  754.         FreeMem(matgroup,sizeof(TDmatgroupnode));
  755.     }
  756.     DeletePool(mesh->matgroupblockspool);
  757.  
  758.     /*
  759.     ** Free the mesh itself
  760.     */
  761.     FreeMem(mesh,sizeof(TDpolymesh));
  762. }
  763.  
  764. /********************************************************************\
  765. *                                                                    *
  766. * Name         : addObjectNode                                       *
  767. *                                                                    *
  768. * Description  : Add a new object node to the space.                 *
  769. *                                                                    *
  770. * Arguments    : space  IN : Pointer to the space.                   *
  771. *                type   IN : Type of object.                         *
  772. *                                                                    *
  773. * Return Value : Index of the new object or 0 if no more memory.     *
  774. *                                                                    *
  775. * Comment      : The array indices are beginnning at 0, index at 1   *
  776. *                                                                    *
  777. \********************************************************************/
  778. static ULONG addObjectNode(TDspace *space,TDenum type) {
  779.     TDobjectnode        *object=NULL;
  780.     TDcube                *cube=NULL;
  781.     TDtexbinding        *texbind=NULL;
  782.     UBYTE                buffer[100];
  783.     ULONG                objectnode,objectblock,realobject;
  784.     
  785.     // check if we have still place for an object node
  786.     objectnode=(space->objects.numberOfObjects)%Ci_OBJECTNODESINBLOCK;
  787.     objectblock=((space->objects.numberOfObjects)-objectnode)/Ci_OBJECTNODESINBLOCK;
  788.  
  789.     // we are above our internal limit
  790.     if(objectblock>=Ci_OBJECTBLOCKS) return(0);
  791.  
  792.     // check if we have to allocate a new nodes list block
  793.     if(objectnode==0) {
  794.         space->objects.blocks[objectblock]=AllocPooled(space->objectblockspool,sizeof(TDobjectblock));
  795.         if(space->objects.blocks[objectblock]==NULL) return(0);
  796.     }
  797.  
  798.     object = AllocMem(sizeof(TDobjectnode),MEMF_FAST);
  799.     if (object==NULL) {
  800.         return(0);
  801.     }
  802.  
  803.     object->name=NULL;
  804.     sprintf(buffer,"tdMESH%ld",space->objects.numberOfObjects);
  805.     object->name = AllocVec(strlen(buffer)+1,MEMF_FAST);
  806.     if (object->name==NULL) {
  807.         FreeMem(object,sizeof(TDobjectnode));
  808.         return(0);
  809.     }
  810.     strcpy(object->name,buffer);
  811.  
  812.     // creating the mesh itself
  813.     switch(type) {
  814.         case TD_POLYMESH :
  815.             realobject=newPolyMesh();
  816.  
  817.             break;
  818.         case TD_CUBE :
  819.             cube=AllocMem(sizeof(TDcube),MEMF_FAST);
  820.             if(cube==NULL) {
  821.                 realobject=0;
  822.             } else {
  823.                 cube->size.x=0.0;cube->size.y=0,0;cube->size.z=0.0;
  824.                 realobject=(ULONG)cube;
  825.             }
  826.  
  827.             break;
  828.         case TD_TEXBINDING :
  829.             texbind=AllocMem(sizeof(TDtexbinding),MEMF_FAST);
  830.             if(texbind==NULL) {
  831.                 realobject=0;
  832.             } else {
  833.                 realobject=(ULONG)texbind;
  834.             }
  835.  
  836.             break;
  837.         default :
  838.             realobject=0;
  839.     }
  840.  
  841.     if(realobject==0) {
  842.         FreeVec(object->name);
  843.         FreeMem(object,sizeof(TDobjectnode));
  844.         return(0);
  845.     }
  846.  
  847.     object->type=type;
  848.     object->handle=realobject;
  849.  
  850.     object->s.x=1.0;
  851.     object->s.y=1.0;
  852.     object->s.z=1.0;
  853.  
  854.     object->r.x=0.0;
  855.     object->r.y=0.0;
  856.     object->r.z=0.0;
  857.  
  858.     object->o.x=0.0;
  859.     object->o.y=0.0;
  860.     object->o.z=0.0;
  861.     
  862.     // assign the node to the nodes list
  863.     space->objects.blocks[objectblock]->nodes[objectnode]=object;
  864.  
  865.     // last increment the numberOfObjects counter
  866.     space->objects.numberOfObjects++;
  867.  
  868.     return(space->objects.numberOfObjects);
  869. }
  870.  
  871. /********************************************************************\
  872. *                                                                    *
  873. * Name         : getObjectNode                                       *
  874. *                                                                    *
  875. * Description  : Search the object its node with its index, in       *
  876. *                the given space. If the index is not valid, NULL    *
  877. *                will be returned.                                   *
  878. *                                                                    *
  879. * Arguments    : space          IN : Pointer to the space            *
  880. *                objectindex    IN : Object index                    *
  881. *                                                                    *
  882. * Return Value : Pointer to the object or NULL if not found.         *
  883. *                                                                    *
  884. * Comment      : The array indices are beginnning at 0, index at 1   *
  885. *                                                                    *
  886. \********************************************************************/
  887. static TDobjectnode *getObjectNode(TDspace *space, ULONG objectindex) {
  888.     ULONG objectblock,objectnode;
  889.  
  890.     // if we have objects, and the index is between 1 and numberOfObjects
  891.     if(space->objects.numberOfObjects==0) return(NULL);
  892.     if(objectindex<1 || objectindex>space->objects.numberOfObjects) return(NULL);
  893.  
  894.     // internal index is index - 1
  895.     objectindex--;
  896.  
  897.     // compute the block and node and return the object node
  898.     objectnode=objectindex%Ci_OBJECTNODESINBLOCK;
  899.     objectblock=(objectindex-objectnode)/Ci_OBJECTNODESINBLOCK;
  900.     return(space->objects.blocks[objectblock]->nodes[objectnode]);
  901. }
  902.  
  903. /********************************************************************\
  904. *                                                                    *
  905. * Name         : vector2CTM                                          *
  906. *                                                                    *
  907. * Description  : Transforms a vector according the CTM.              *
  908. *                                                                    *
  909. * Arguments    : ctm      IN : CTM to use.                           *
  910. *                vector   IN : Vector to transform.                  *
  911. *                                                                    *
  912. * Comment      : This function is for time uncritical use only !     *
  913. *                                                                    *
  914. \********************************************************************/
  915. static VOID vector2CTM(TDctm ctm, TDvectord *vector) {
  916.     TDvectord rvector;
  917.  
  918.     rvector=(*vector);
  919.  
  920.     // Scaling
  921.     rvector.x*=ctm.sx,rvector.y*=ctm.sy,rvector.z*=ctm.sz;
  922.  
  923.     //Rotation and translation
  924.     vector->x=ctm.m[0][0]*rvector.x+ctm.m[1][0]*rvector.y+ctm.m[2][0]*rvector.z+ctm.m[3][0]; 
  925.     vector->y=ctm.m[0][1]*rvector.x+ctm.m[1][1]*rvector.y+ctm.m[2][1]*rvector.z+ctm.m[3][1]; 
  926.     vector->z=ctm.m[0][2]*rvector.x+ctm.m[1][2]*rvector.y+ctm.m[2][2]*rvector.z+ctm.m[3][2]; 
  927. }
  928.  
  929. /********************************************************************\
  930. *                                                                    *
  931. * Name         : addMatGroupNode                                     *
  932. *                                                                    *
  933. * Description  : Add a new matgroup node to the polymesh.            *
  934. *                                                                    *
  935. * Arguments    : mesh      IN : Pointer to the polymesh.             *
  936. *                matnode   IN : Node of the material.                *
  937. *                                                                    *
  938. * Return Value : Node of the new matgroup or NULL if no more memory. *
  939. *                                                                    *
  940. * Comment      : The array indices are beginnning at 0, index at 1   *
  941. *                                                                    *
  942. \********************************************************************/
  943. static TDmatgroupnode *addMatGroupNode(TDpolymesh *mesh,TDmaterialnode *matnode) {
  944.     static TDmatgroupnode        *matgroup=NULL;
  945.     ULONG    matgroupnode,matgroupblock;
  946.     
  947.     // check if we have still place for a matgroup node
  948.     matgroupnode=(mesh->matgroups.numberOfMatGroups)%Ci_MATGROUPNODESINBLOCK;
  949.     matgroupblock=((mesh->matgroups.numberOfMatGroups)-matgroupnode)/Ci_MATGROUPNODESINBLOCK;
  950.  
  951.     if(matgroupblock>=Ci_MATGROUPBLOCKS) return(NULL);
  952.  
  953.     // check if we have to allocate a new nodes list block
  954.     if(matgroupnode==0) {
  955.         mesh->matgroups.blocks[matgroupblock]=AllocPooled(mesh->matgroupblockspool,sizeof(TDmatgroupblock));
  956.         if(mesh->matgroups.blocks[matgroupblock]==NULL) return(NULL);
  957.     }
  958.  
  959.     matgroup = AllocMem(sizeof(TDmatgroupnode),MEMF_FAST);
  960.     if (matgroup==NULL) {
  961.         return(NULL);
  962.     }
  963.  
  964.     matgroup->polygons.numberOfPolygons=0;
  965.     matgroup->polygons.numberOfVertices=0;
  966.  
  967.     matgroup->materialnode=NULL;
  968.     matgroup->texbindex=0;
  969.  
  970.     switch(matnode->type) {
  971.         case TD_SURFACE :
  972.             matgroup->materialnode=matnode;
  973.             break;
  974.     }
  975.  
  976.     // assign the node to the nodes list
  977.     mesh->matgroups.blocks[matgroupblock]->nodes[matgroupnode]=matgroup;
  978.  
  979.     // last increment the numberOfMatGroups counter
  980.     mesh->matgroups.numberOfMatGroups++;
  981.  
  982.     return(matgroup);
  983. }
  984.  
  985. /********************************************************************\
  986. *                                                                    *
  987. * Name         : addPolygon                                          *
  988. *                                                                    *
  989. * Description  : Adds the polygon to the matgroup of the mesh,       *
  990. *                The size of the vertex array may be set.            *
  991. *                                                                    *
  992. * Arguments    : mesh     IN : Pointer to the mesh.                  *
  993. *                matgroup IN : Pointer to the matgroup.              *
  994. *                 size     IN : Initial size of the polygon.          *
  995. *                                                                    *
  996. * Return Value : Pointer to the polygon node or NULL if no memory.   *
  997. *                                                                    *
  998. * Comment      : The array indices are beginnning at 0, index at 1   *
  999. *                                                                    *
  1000. \********************************************************************/
  1001. static TDpolygonnode *addPolygon(TDpolymesh *mesh,TDmatgroupnode *matgroup,ULONG size) {
  1002.  
  1003.     TDpolygonnode        *poly=NULL;
  1004.     ULONG                polyparray,polybarray,polyblock;
  1005.  
  1006.     // check if we have still place for a polygon node
  1007.     polyparray=(matgroup->polygons.numberOfPolygons)%Ci_POLYARRAY;
  1008.     polybarray=(((matgroup->polygons.numberOfPolygons)-polyparray)/Ci_POLYARRAY)%Ci_POLYARRAYINBLOCK;
  1009.     polyblock=(polybarray*Ci_POLYARRAYINBLOCK+polyparray)/(Ci_POLYARRAY*Ci_POLYARRAYINBLOCK);
  1010.  
  1011.     if(polyblock>=Ci_POLYBLOCKS) return(NULL);
  1012.  
  1013.     // check if we have to allocate a new array of polygon arrays
  1014.     if(polybarray==0 && polyparray==0) {
  1015.         matgroup->polygons.blocks[polyblock]=AllocPooled(mesh->polyblockspool,sizeof(TDpolygonblock));
  1016.         if(matgroup->polygons.blocks[polyblock]==NULL) return(NULL);
  1017.     }
  1018.  
  1019.     // check if we have to allocate a new array of polygons
  1020.     if(polyparray==0) {
  1021.         matgroup->polygons.blocks[polyblock]->barray[polybarray]=AllocPooled(mesh->polyarraypool,sizeof(TDpolygonarray));
  1022.         if(matgroup->polygons.blocks[polyblock]->barray[polybarray]==NULL) return(NULL);
  1023.     }
  1024.  
  1025.     // make a new polygon node
  1026.     poly = AllocPooled(mesh->polypool,sizeof(TDpolygonnode));
  1027.     if (poly==NULL) return(NULL);
  1028.  
  1029.     poly->numberOfVertices=0;
  1030.  
  1031.     // make a new polygon vertex array node
  1032.     poly->varray = AllocPooled(mesh->polyverpool,size*sizeof(ULONG));
  1033.     if (poly->varray==NULL) return(NULL);
  1034.  
  1035.     // assign the polygon node to the polygon array list
  1036.     matgroup->polygons.blocks[polyblock]->barray[polybarray]->parray[polyparray]=poly;
  1037.  
  1038.     // last increment the numberOfPolygons counters
  1039.     mesh->matgroups.numberOfPolygons++;
  1040.     matgroup->polygons.numberOfPolygons++;
  1041.  
  1042.     return(poly);
  1043. }
  1044.  
  1045. /********************************************************************\
  1046. *                                                                    *
  1047. * Name         : getPolygonNode                                      *
  1048. *                                                                    *
  1049. * Description  : Search the polygon with its index, in the given     *
  1050. *                matgroup. If the index is not valid, NULL will be   *
  1051. *                returned.                                           *
  1052. *                                                                    *
  1053. * Arguments    : matgroup     IN : Pointer to the matgroup.          *
  1054. *                polyindex    IN : Polygon index.                    *
  1055. *                                                                    *
  1056. * Return Value : Pointer to the polygon or NULL if not found.        *
  1057. *                                                                    *
  1058. * Comment      : The array indices are beginnning at 0, index at 1   *
  1059. *                                                                    *
  1060. \********************************************************************/
  1061. static TDpolygonnode *getPolygonNode(TDmatgroupnode *matgroup, ULONG polyindex) {
  1062.     ULONG    polyparray,polybarray,polyblock;
  1063.  
  1064.     // if we have polygons, and the index is between 1 and numberOfPolygons
  1065.     if(matgroup->polygons.numberOfPolygons==0) return(NULL);
  1066.     if(polyindex<1 || polyindex>matgroup->polygons.numberOfPolygons) return(NULL);
  1067.  
  1068.     // internal index is - 1
  1069.     polyindex--;
  1070.  
  1071.     // compute the block, arraylist and array place and return the polygon
  1072.     polyparray=(polyindex)%Ci_POLYARRAY;
  1073.     polybarray=((polyindex-polyparray)/Ci_POLYARRAY)%Ci_POLYARRAYINBLOCK;
  1074.     polyblock=(polybarray*Ci_POLYARRAYINBLOCK+polyparray)/(Ci_POLYARRAY*Ci_POLYARRAYINBLOCK);
  1075.  
  1076.     return(matgroup->polygons.blocks[polyblock]->barray[polybarray]->parray[polyparray]);
  1077. }
  1078.  
  1079. /********************************************************************\
  1080. *                                                                    *
  1081. * Name         : addVertex                                           *
  1082. *                                                                    *
  1083. * Description  : Adds the vertex to the mesh, And returns the index  *
  1084. *                to it.                                              *
  1085. *                The vertex will be transformed according the CTM    *
  1086. *                                                                    *
  1087. * Arguments    : mesh   IN : Pointer to the mesh.                    *
  1088. *                ctm    IN : The current transformation matrix.      *
  1089. *                vertex IN : The vertex to add.                      *
  1090. *                                                                    *
  1091. * Return Value : Index of the vertex. Or 0 if no more memory.        *
  1092. *                                                                    *
  1093. * Comment      : The array indices are beginnning at 0, index at 1   *
  1094. *                                                                    *
  1095. \********************************************************************/
  1096. static ULONG addVertex(TDpolymesh *mesh,TDctm ctm,TDvectord vertex) {
  1097.  
  1098.     TDvectord        rvertex,*ver=NULL;
  1099.     ULONG            vervarray,verbarray,verblock;
  1100.  
  1101.     // check if we have still place for a vertex node
  1102.     vervarray=(mesh->vertices.numberOfVertices)%Ci_VERTEXARRAY;
  1103.     verbarray=(((mesh->vertices.numberOfVertices)-vervarray)/Ci_VERTEXARRAY)%Ci_VERTEXARRAYINBLOCK;
  1104.     verblock=(verbarray*Ci_VERTEXARRAYINBLOCK+vervarray)/(Ci_VERTEXARRAY*Ci_VERTEXARRAYINBLOCK);
  1105.  
  1106.     if(verblock>=Ci_VERTEXBLOCKS) return(0);
  1107.  
  1108.     // check if we have to allocate a new array of vertex arrays
  1109.     if(verbarray==0 && vervarray==0) {
  1110.         mesh->vertices.blocks[verblock]=AllocPooled(mesh->vertexblockspool,sizeof(TDvertexblock));
  1111.         if(mesh->vertices.blocks[verblock]==NULL) return(0);
  1112.     }
  1113.  
  1114.     // check if we have to allocate a new array of vertices
  1115.     if(vervarray==0) {
  1116.         mesh->vertices.blocks[verblock]->barray[verbarray]=AllocPooled(mesh->vertexarraypool,sizeof(TDvertexarray));
  1117.         if(mesh->vertices.blocks[verblock]->barray[verbarray]==NULL) return(0);
  1118.     }
  1119.  
  1120.     // Transforming the the vertex according the CTM
  1121.  
  1122.     // Scaling
  1123.     vertex.x*=ctm.sx,vertex.y*=ctm.sy,vertex.z*=ctm.sz;
  1124.  
  1125.     //Rotation and translation
  1126.     rvertex.x=ctm.m[0][0]*vertex.x+ctm.m[1][0]*vertex.y+ctm.m[2][0]*vertex.z+ctm.m[3][0]; 
  1127.     rvertex.y=ctm.m[0][1]*vertex.x+ctm.m[1][1]*vertex.y+ctm.m[2][1]*vertex.z+ctm.m[3][1]; 
  1128.     rvertex.z=ctm.m[0][2]*vertex.x+ctm.m[1][2]*vertex.y+ctm.m[2][2]*vertex.z+ctm.m[3][2]; 
  1129.  
  1130.     // make a copy of the vertex
  1131.     ver = AllocPooled(mesh->vertexpool,sizeof(TDvectord));
  1132.     if (ver==NULL) return(0);
  1133.     
  1134.     (*ver)=rvertex;
  1135.  
  1136.     // assign the vertex copy to the vertex array list
  1137.     mesh->vertices.blocks[verblock]->barray[verbarray]->varray[vervarray]=ver;
  1138.  
  1139.     ver=mesh->vertices.blocks[verblock]->barray[verbarray]->varray[vervarray];
  1140.  
  1141.     // Recalculate the bounding box
  1142.     if(rvertex.x<mesh->bBox.left)   mesh->bBox.left=rvertex.x;
  1143.     if(rvertex.x>mesh->bBox.right)  mesh->bBox.right=rvertex.x;
  1144.     if(rvertex.y<mesh->bBox.rear)   mesh->bBox.rear=rvertex.y;
  1145.     if(rvertex.y>mesh->bBox.front)  mesh->bBox.front=rvertex.y;
  1146.     if(rvertex.z<mesh->bBox.bottom) mesh->bBox.bottom=rvertex.z;
  1147.     if(rvertex.z>mesh->bBox.top)    mesh->bBox.top=rvertex.z;
  1148.  
  1149.     // last increment the numberOfVertices counter
  1150.     mesh->vertices.numberOfVertices++;
  1151.  
  1152.     return(mesh->vertices.numberOfVertices);
  1153. }
  1154.  
  1155. /********************************************************************\
  1156. *                                                                    *
  1157. * Name         : getVertex                                           *
  1158. *                                                                    *
  1159. * Description  : Search the vertex with its index, in the given      *
  1160. *                mesh. If the index is not valid, NULL will be       *
  1161. *                returned.                                           *
  1162. *                                                                    *
  1163. * Arguments    : mesh           IN : Pointer to the mesh.            *
  1164. *                vertexindex    IN : Vertex index                    *
  1165. *                                                                    *
  1166. * Return Value : Pointer to the vertex or NULL if not found.         *
  1167. *                                                                    *
  1168. * Comment      : The array indices are beginnning at 0, index at 1   *
  1169. *                                                                    *
  1170. \********************************************************************/
  1171. static TDvectord *getVertex(TDpolymesh *mesh, ULONG vertexindex) {
  1172.     ULONG    vervarray,verbarray,verblock;
  1173.  
  1174.     // if we have vertices, and the index is between 1 and numberOfVertices
  1175.     if(mesh->vertices.numberOfVertices==0) return(NULL);
  1176.     if(vertexindex<1 || vertexindex>mesh->vertices.numberOfVertices) return(NULL);
  1177.  
  1178.     // internal index is - 1
  1179.     vertexindex--;
  1180.  
  1181.     // compute the block, arraylist and array place and return the vertex
  1182.     vervarray=(vertexindex)%Ci_VERTEXARRAY;
  1183.     verbarray=((vertexindex-vervarray)/Ci_VERTEXARRAY)%Ci_VERTEXARRAYINBLOCK;
  1184.     verblock=(verbarray*Ci_VERTEXARRAYINBLOCK+vervarray)/(Ci_VERTEXARRAY*Ci_VERTEXARRAYINBLOCK);
  1185.  
  1186.     return(mesh->vertices.blocks[verblock]->barray[verbarray]->varray[vervarray]);
  1187. }
  1188.  
  1189. /********************************************************************\
  1190. *                                                                    *
  1191. * Name         : assignVertex                                        *
  1192. *                                                                    *
  1193. * Description  : Assigns a vertex to a polygon node. The array of the*
  1194. *                node will be expanded if necessary.                 *
  1195. *                Assumed that the polygon has a minimum sized array  *
  1196. *                of Ci_POLYVERARRAYINIT.                             *
  1197. *                                                                    *
  1198. * Arguments    : mesh         IN : Pointer to the mesh.              *
  1199. *                 matgroup     IN : Pointer to the matgroup.          *
  1200. *                poly         IN : Pointer to the polygon.           *
  1201. *                 vertexindex  IN : Index to the vertex to assign.    *
  1202. *                                                                    *
  1203. * Return Value : 0 if no memory or the polygons count of vertices.   *
  1204. *                                                                    *
  1205. * Comment      : The array indices are beginnning at 0, index at 1   *
  1206. *                                                                    *
  1207. \********************************************************************/
  1208. static ULONG assignVertex(TDpolymesh *mesh,TDmatgroupnode *matgroup,
  1209.                             TDpolygonnode *poly,ULONG vertexindex) {
  1210.  
  1211.     ULONG    *varray;
  1212.     ULONG    nof;
  1213.  
  1214.     nof=poly->numberOfVertices;
  1215.  
  1216.     // check if we have to expand the vertex array
  1217.     if(nof<Ci_POLYVERARRAYINIT) {
  1218.         poly->varray[nof]=vertexindex;
  1219.     } else {
  1220.         // make a new polygon vertex array
  1221.         varray = AllocPooled(mesh->polyverpool,(nof+1)*sizeof(ULONG));
  1222.         if(varray==NULL) return(0);
  1223.  
  1224.         // copy the old array into the new one
  1225.         CopyMem(poly->varray,varray,nof*sizeof(ULONG));
  1226.  
  1227.         // free the old one
  1228.         FreePooled(mesh->polyverpool,poly->varray,nof*sizeof(ULONG));
  1229.  
  1230.         // assign the new array to the polygon
  1231.         poly->varray=varray;
  1232.  
  1233.         // assign the new vertex index
  1234.         poly->varray[nof]=vertexindex;
  1235.     }
  1236.  
  1237.     // last increment the numberOfVertices counters
  1238.     matgroup->polygons.numberOfVertices++;
  1239.     poly->numberOfVertices++;
  1240.  
  1241.     return(poly->numberOfVertices);
  1242. }
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.  
  1261.  
  1262.  
  1263.  
  1264.  
  1265.  
  1266.  
  1267.  
  1268.  
  1269.  
  1270. /********************************************************************\
  1271. *                                                                    *
  1272. * Name         : setCameraLight                                      *
  1273. *                                                                    *
  1274. * Description  : Sets the default position of the camera and the     *
  1275. *                light and the camera its view point and the color   *
  1276. *                of the light source.                                *
  1277. *                                                                    *
  1278. * Arguments    : mesh      IN/OUT : Pointer to the mesh.             *
  1279. *                                                                    *
  1280. * Comment      :                                                     *
  1281. *                                                                    *
  1282. \********************************************************************/
  1283. static VOID setCameraLight(TTDOMesh *mesh) {
  1284.     TTDOVertexd ver1;
  1285.         
  1286.     if (mesh==NULL) return;
  1287.  
  1288.     /* camera its look at position */
  1289.     mesh->camera.lookat.x = (mesh->bBox.left + mesh->bBox.right) / 2;
  1290.     mesh->camera.lookat.y = (mesh->bBox.front + mesh->bBox.rear) / 2;
  1291.     mesh->camera.lookat.z = (mesh->bBox.top + mesh->bBox.bottom) / 2;
  1292.     
  1293.     /* direction vector */
  1294.     ver1.x = mesh->bBox.right - mesh->camera.lookat.x;
  1295.     ver1.y = mesh->bBox.front - mesh->camera.lookat.y;
  1296.     ver1.z = mesh->bBox.top - mesh->camera.lookat.z;
  1297.     
  1298.     ver1.x*=2.5;
  1299.     ver1.y*=2.5;    
  1300.     ver1.z*=2.5;
  1301.     
  1302.     /* camera its position */
  1303.     mesh->camera.position.x = ver1.x + mesh->camera.lookat.x;
  1304.     mesh->camera.position.y = ver1.y + mesh->camera.lookat.y;
  1305.     mesh->camera.position.z = ver1.z + mesh->camera.lookat.z;
  1306.  
  1307.     /* light source its position */
  1308.     mesh->light.position.x = ver1.x + mesh->camera.lookat.x;
  1309.     mesh->light.position.y = ver1.x + mesh->camera.lookat.x;
  1310.     mesh->light.position.z = ver1.x + mesh->camera.lookat.x;
  1311.     
  1312.     /* light source its color */
  1313.     mesh->light.color.r=255;
  1314.     mesh->light.color.g=255;
  1315.     mesh->light.color.b=255;
  1316. }
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333. /********************************************************************\
  1334. *                                                                    *
  1335. * Name         : spaceClean                                          *
  1336. *                                                                    *
  1337. * Description  : If an error occurs while creating a new space, call *
  1338. *                this one to delete it.                              *
  1339. *                                                                    *
  1340. * Arguments    : space   IN : Pointer to the space.                  *
  1341. *                                                                    *
  1342. * Comment      :                                                     *
  1343. *                                                                    *
  1344. \********************************************************************/
  1345. static VOID spaceClean(TDspace *space) {
  1346.  
  1347.     DeletePool(space->objectblockspool);
  1348.     DeletePool(space->matblockspool);
  1349.     FreeVec(space->name);
  1350.     FreeMem(space,sizeof(TDspace));
  1351. };
  1352.  
  1353. /********************** Public functions ****************************/
  1354.  
  1355. /********************************************************************\
  1356. *                                                                    *
  1357. * Name         : initTDLibrary                                       *
  1358. *                                                                    *
  1359. * Description  : Initializes the TD library.                         *
  1360. *                                                                    *
  1361. * Return Value : 0 if all went well or 1 when no memory or file      *
  1362. *                accessing errors.                                   *
  1363. *                                                                    *
  1364. * Comment      :                                                     *
  1365. *                                                                    *
  1366. \********************************************************************/
  1367. ULONG initTDLibrary () {
  1368.     TD3dlibinfo *lib3dinfo=NULL;
  1369.  
  1370.     if((tdlibinfos=AllocMem(sizeof(TDlibraryinfo),MEMF_FAST))!=NULL) {
  1371.         if((tdlibinfos->lib3dinfos=AllocMem(sizeof(TD3dlibinfo *)*5,MEMF_FAST))!=NULL) {
  1372.  
  1373.             tdlibinfos->lib3dinfos[0]=AllocMem(sizeof(TD3dlibinfo),MEMF_FAST);
  1374.             lib3dinfo=tdlibinfos->lib3dinfos[0];
  1375.             lib3dinfo->library=AllocVec(sizeof(UBYTE)*strlen("dxf.library")+1,MEMF_FAST);
  1376.             strcpy(lib3dinfo->library,"dxf.library");
  1377.             lib3dinfo->name=AllocVec(sizeof(UBYTE)*strlen("Autocad DXF (TD)")+1,MEMF_FAST);
  1378.             strcpy(lib3dinfo->name,"Autocad DXF (TD)");
  1379.             lib3dinfo->ext=AllocVec(sizeof(UBYTE)*strlen("dxf")+1,MEMF_FAST);
  1380.             strcpy(lib3dinfo->ext,"dxf");
  1381.             lib3dinfo->supl=AllocVec(sizeof(TDenum)*3,MEMF_FAST);
  1382.             lib3dinfo->supl[0]=TD_OBJECT;
  1383.             lib3dinfo->supl[1]=TD_MATERIAL;
  1384.             lib3dinfo->supl[2]=TD_NOTHING;
  1385.             lib3dinfo->sups=AllocVec(sizeof(TDenum)*4,MEMF_FAST);
  1386.             lib3dinfo->sups[0]=TD_OBJECT;
  1387.             lib3dinfo->sups[1]=TD_MATERIAL;
  1388.             lib3dinfo->sups[2]=TD_SURFACE;
  1389.             lib3dinfo->sups[3]=TD_NOTHING;
  1390.  
  1391.             tdlibinfos->lib3dinfos[1]=AllocMem(sizeof(TD3dlibinfo),MEMF_FAST);
  1392.             lib3dinfo=tdlibinfos->lib3dinfos[1];
  1393.             lib3dinfo->library=AllocVec(sizeof(UBYTE)*strlen("rawa.library")+1,MEMF_FAST);
  1394.             strcpy(lib3dinfo->library,"rawa.library");
  1395.             lib3dinfo->name=AllocVec(sizeof(UBYTE)*strlen("RAW ASCII (TD)")+1,MEMF_FAST);
  1396.             strcpy(lib3dinfo->name,"RAW ASCII (TD)");
  1397.             lib3dinfo->ext=AllocVec(sizeof(UBYTE)*strlen("raw")+1,MEMF_FAST);
  1398.             strcpy(lib3dinfo->ext,"raw");
  1399.             lib3dinfo->supl=AllocVec(sizeof(TDenum)*2,MEMF_FAST);
  1400.             lib3dinfo->supl[0]=TD_OBJECT;
  1401.             lib3dinfo->supl[1]=TD_NOTHING;
  1402.             lib3dinfo->sups=NULL;
  1403.  
  1404.             tdlibinfos->lib3dinfos[2]=AllocMem(sizeof(TD3dlibinfo),MEMF_FAST);
  1405.             lib3dinfo=tdlibinfos->lib3dinfos[2];
  1406.             lib3dinfo->library=AllocVec(sizeof(UBYTE)*strlen("geoa.library")+1,MEMF_FAST);
  1407.             strcpy(lib3dinfo->library,"geoa.library");
  1408.             lib3dinfo->name=AllocVec(sizeof(UBYTE)*strlen("Videoscape ASCII (TD)")+1,MEMF_FAST);
  1409.             strcpy(lib3dinfo->name,"Videoscape ASCII (TD)");
  1410.             lib3dinfo->ext=AllocVec(sizeof(UBYTE)*strlen("geo")+1,MEMF_FAST);
  1411.             strcpy(lib3dinfo->ext,"geo");
  1412.             lib3dinfo->supl=AllocVec(sizeof(TDenum)*2,MEMF_FAST);
  1413.             lib3dinfo->supl[0]=TD_OBJECT;
  1414.             lib3dinfo->supl[1]=TD_NOTHING;
  1415.             lib3dinfo->sups=AllocVec(sizeof(TDenum)*2,MEMF_FAST);
  1416.             lib3dinfo->sups[0]=TD_OBJECT;
  1417.             lib3dinfo->sups[1]=TD_NOTHING;
  1418.  
  1419.             tdlibinfos->lib3dinfos[3]=AllocMem(sizeof(TD3dlibinfo),MEMF_FAST);
  1420.             lib3dinfo=tdlibinfos->lib3dinfos[3];
  1421.             lib3dinfo->library=AllocVec(sizeof(UBYTE)*strlen("vrml.library")+1,MEMF_FAST);
  1422.             strcpy(lib3dinfo->library,"vrml.library");
  1423.             lib3dinfo->name=AllocVec(sizeof(UBYTE)*strlen("VRML 1.0 (TD)")+1,MEMF_FAST);
  1424.             strcpy(lib3dinfo->name,"VRML 1.0 (TD)");
  1425.             lib3dinfo->ext=AllocVec(sizeof(UBYTE)*strlen("wrl")+1,MEMF_FAST);
  1426.             strcpy(lib3dinfo->ext,"wrl");
  1427.             lib3dinfo->supl=NULL;
  1428.             lib3dinfo->sups=AllocVec(sizeof(TDenum)*3,MEMF_FAST);
  1429.             lib3dinfo->sups[0]=TD_SPACE;
  1430.             lib3dinfo->sups[1]=TD_MATERIAL;
  1431.             lib3dinfo->sups[2]=TD_NOTHING;
  1432.  
  1433.             tdlibinfos->lib3dinfos[4]=NULL;
  1434.  
  1435.             return(0);
  1436.         }
  1437.     }
  1438.     
  1439.     return(1);
  1440. }
  1441.  
  1442. /********************************************************************\
  1443. *                                                                    *
  1444. * Name         : freeTDLibrary                                       *
  1445. *                                                                    *
  1446. * Description  : Free all memory allocated in initTDLibrary.         *
  1447. *                                                                    *
  1448. * Comment      :                                                     *
  1449. *                                                                    *
  1450. \********************************************************************/
  1451. VOID freeTDLibrary () {
  1452.     ULONG i=0;
  1453.     TD3dlibinfo *lib3dinfo=NULL;
  1454.  
  1455.     // free the library information structure
  1456.     if(tdlibinfos!=NULL) {
  1457.         // free the 3d library informations
  1458.         if(tdlibinfos->lib3dinfos!=NULL) {
  1459.             i=0;
  1460.             while(tdlibinfos->lib3dinfos[i]!=NULL) {
  1461.                 lib3dinfo=tdlibinfos->lib3dinfos[i];
  1462.  
  1463.                 FreeVec(lib3dinfo->library);
  1464.                 FreeVec(lib3dinfo->name);
  1465.                 FreeVec(lib3dinfo->ext);
  1466.  
  1467.                 if(lib3dinfo->supl!=NULL) {
  1468.                     FreeVec(lib3dinfo->supl);
  1469.                 }
  1470.  
  1471.                 if(lib3dinfo->sups!=NULL) {
  1472.                     FreeVec(lib3dinfo->sups);
  1473.                 }
  1474.  
  1475.                 FreeMem(lib3dinfo,sizeof(TD3dlibinfo));
  1476.                 i++;
  1477.             }
  1478.  
  1479.             i++;
  1480.             FreeMem(tdlibinfos->lib3dinfos,sizeof(TD3dlibinfo *)*i);
  1481.         }
  1482.  
  1483.         FreeMem(tdlibinfos,sizeof(TDlibraryinfo));
  1484.     }
  1485. }
  1486.  
  1487. /********************************************************************\
  1488. *                                                                    *
  1489. * Name         : fill3DFormatArrays.                                 *
  1490. *                                                                    *
  1491. * Description  : Fills up all 3D format arrays.                      *
  1492. *                                                                    *
  1493. * Arguments    : mesh         IN : Pointer to the mesh.              *
  1494. *                 rvertex      IN : Vertex with coordinates.          *
  1495. *                operation    IN : Operation to perform.             *
  1496. *                                                                    *
  1497. * Return Value : 0 if all went well or 1 when no memory or file      *
  1498. *                accessing errors.                                   *
  1499. *                                                                    *
  1500. * Comment      :                                                     *
  1501. *                                                                    *
  1502. \********************************************************************/
  1503. ULONG fill3DFormatArrays(){
  1504.  
  1505. /*
  1506. #include <dos/dos.h>
  1507. #include <dos/exall.h>
  1508. #include <dos/stdio.h>
  1509.  
  1510. #include <clib/exec_protos.h>
  1511. #include <clib/dos_protos.h>
  1512. #include <clib/alib_stdio_protos.h>
  1513.  
  1514. #define BUFFERSIZE 2048
  1515.  
  1516.  
  1517.     BPTR fl;
  1518.     struct ExAllControl *eac;
  1519.     struct ExAllData *ed,*p;
  1520.     LONG more,res2;
  1521.     ULONG n;
  1522.     UBYTE pattern[30];
  1523.  
  1524.  
  1525.     if((fl=Lock("libs:tdo/3dx",SHARED_LOCK)) != NULL) {
  1526.         if((eac=AllocDosObject(DOS_EXALLCONTROL, NULL)) != NULL) {
  1527.             if((ed=AllocMem(BUFFERSIZE,0))!=NULL) {
  1528.                 if(ParsePatternNoCase("#?.library",pattern,30)!=-1) {
  1529.                     eac->eac_LastKey=0;
  1530.                     eac->eac_MatchString=pattern;
  1531.                     eac->eac_MatchFunc=NULL;
  1532.  
  1533.                     do {
  1534.                         if((more=ExAll(fl,ed,BUFFERSIZE,ED_NAME,eac))!=DOSFALSE) {
  1535.                             for(p=ed,n=eac->eac_Entries;n!=0;p=p->ed_Next,--n) {
  1536.                                 printf("%s\n",p->ed_Name);
  1537.                             }
  1538.                         } else {
  1539.                             // fehler, buffer to small oder sonst was
  1540.                             ExAllEnd(fl,ed,BUFFERSIZE,ED_NAME,eac);
  1541.                             more=DOSFALSE;
  1542.                         }
  1543.                     } while(more!=DOSFALSE);
  1544.                     FreeMem(ed,BUFFERSIZE);
  1545.                 }
  1546.             }
  1547.             FreeDosObject(DOS_EXALLCONTROL,eac);
  1548.         }
  1549.         UnLock(fl);
  1550.     }
  1551. */
  1552. // !! nach namen format sortieren, alle arrays !
  1553.  
  1554.     BPTR fl;
  1555.     struct ExAllControl *eac;
  1556.     struct ExAllData *ed,*p;
  1557.     LONG more;
  1558.     ULONG n;
  1559.     UBYTE pattern[30];
  1560.     UBYTE libname[200];
  1561.  
  1562.     if((fl=Lock("libs:tdo/3x",SHARED_LOCK)) != NULL) {
  1563.         if((eac=AllocDosObject(DOS_EXALLCONTROL, NULL)) != NULL) {
  1564.             if((ed=AllocMem(EXALLBUFFERSIZE,0))!=NULL) {
  1565.                 if(ParsePatternNoCase("#?.library",pattern,30)!=-1) {
  1566.                     eac->eac_LastKey=0;
  1567.                     eac->eac_MatchString=pattern;
  1568.                     eac->eac_MatchFunc=NULL;
  1569.  
  1570.                     do {
  1571.                         if((more=ExAll(fl,ed,EXALLBUFFERSIZE,ED_NAME,eac))==DOSFALSE) {
  1572.                             for(p=ed,n=eac->eac_Entries;n!=0;p=p->ed_Next,--n) {
  1573.                                 printf("%s\n",p->ed_Name);
  1574.  
  1575.                                 // we skip corrupt libraries !
  1576.                                 sprintf(libname,"libs:tdo/3x/%s",p->ed_Name);
  1577.                                 if((x3Base=(APTR) OpenLibrary(libname,0))!=NULL) {
  1578. // lokales grosses array fuer init, dann copy nach c3... da ja zuerst alles lesen usw...
  1579.                                     printf("impl S %ld L %ld\n",tdo3XSave(0,NULL,NULL),tdo3XLoad(0,NULL,NULL,NULL));
  1580.  
  1581.                                     CloseLibrary((APTR)x3Base);
  1582.                                 }
  1583.                             }
  1584.                         } else {
  1585.                             // buffer to small or dos error
  1586.                             ExAllEnd(fl,ed,EXALLBUFFERSIZE,ED_NAME,eac);
  1587.                             more=DOSFALSE;
  1588.                         }
  1589.                     } while(more!=DOSFALSE);
  1590.                     FreeMem(ed,EXALLBUFFERSIZE);
  1591.                 }
  1592.             }
  1593.             FreeDosObject(DOS_EXALLCONTROL,eac);
  1594.         }
  1595.         UnLock(fl);
  1596.     }
  1597. /*
  1598.     c3dsLib=AllocVec(4*sizeof(STRPTR),MEMF_FAST);
  1599.     c3dsLib[0]=AllocVec(strlen("rawb.library")+1,MEMF_FAST);
  1600.     strcpy(c3dsLib[0],"rawb.library");
  1601.     c3dsLib[1]=AllocVec(strlen("geoa.library")+1,MEMF_FAST);
  1602.     strcpy(c3dsLib[1],"geoa.library");
  1603.     c3dsLib[2]=AllocVec(strlen("rawa.library")+1,MEMF_FAST);
  1604.     strcpy(c3dsLib[2],"rawa.library");
  1605.     c3dsLib[3]=NULL;
  1606.  
  1607.     c3dsNames=AllocVec(4*sizeof(STRPTR),MEMF_FAST);
  1608.     c3dsNames[0]=AllocVec(strlen("RAW binary")+1,MEMF_FAST);
  1609.     strcpy(c3dsNames[0],"RAW binary");
  1610.     c3dsNames[1]=AllocVec(strlen("Videoscape ASCII")+1,MEMF_FAST);
  1611.     strcpy(c3dsNames[1],"Videoscape ASCII");
  1612.     c3dsNames[2]=AllocVec(strlen("RAW ASCII")+1,MEMF_FAST);
  1613.     strcpy(c3dsNames[2],"RAW ASCII");
  1614.     c3dsNames[3]=NULL;
  1615.  
  1616.     c3dsExt=AllocVec(4*sizeof(STRPTR),MEMF_FAST);
  1617.     c3dsExt[0]=AllocVec(strlen("raw")+1,MEMF_FAST);
  1618.     strcpy(c3dsExt[0],"raw");
  1619.     c3dsExt[1]=AllocVec(strlen("geo")+1,MEMF_FAST);
  1620.     strcpy(c3dsExt[1],"geo");
  1621.     c3dsExt[2]=AllocVec(strlen("raw")+1,MEMF_FAST);
  1622.     strcpy(c3dsExt[2],"raw");
  1623.     c3dsExt[3]=NULL;
  1624.  
  1625.  
  1626.     c3dlLib=AllocVec(2*sizeof(STRPTR),MEMF_FAST);
  1627.     c3dlLib[0]=AllocVec(strlen("dxf.library")+1,MEMF_FAST);
  1628.     strcpy(c3dlLib[0],"dxf.library");
  1629.     c3dlLib[1]=AllocVec(strlen("ref4.library")+1,MEMF_FAST);
  1630.     strcpy(c3dlLib[1],"ref4.library");
  1631.     c3dlLib[2]=NULL;
  1632.  
  1633.     c3dlNames=AllocVec(2*sizeof(STRPTR),MEMF_FAST);
  1634.     c3dlNames[0]=AllocVec(strlen("Autodesk DXF")+1,MEMF_FAST);
  1635.     strcpy(c3dlNames[0],"Autodesk DXF");
  1636.     c3dlNames[1]=AllocVec(strlen("Reflections 4")+1,MEMF_FAST);
  1637.     strcpy(c3dlNames[1],"Reflections 4");
  1638.     c3dlNames[2]=NULL;
  1639. */
  1640.  
  1641.     return(0);
  1642. }
  1643.  
  1644. /********************************************************************\
  1645. *                                                                    *
  1646. * Name         : free3DFormatArrays.                                 *
  1647. *                                                                    *
  1648. * Description  : Free all 3D format arrays.                          *
  1649. *                                                                    *
  1650. * Comment      :                                                     *
  1651. *                                                                    *
  1652. \********************************************************************/
  1653. VOID free3DFormatArrays(){
  1654.     ULONG i;
  1655.  
  1656.     // 3D save libraries
  1657.     i=0;
  1658.     if(c3dsLib!=NULL) {
  1659.         while(c3dsLib[i]!=NULL) {
  1660.             FreeVec(c3dsLib[i++]);
  1661.         }
  1662.         FreeVec(c3dsLib);
  1663.         c3dsLib=NULL;
  1664.     }
  1665.  
  1666.     i=0;
  1667.     if(c3dsNames!=NULL) {
  1668.         while(c3dsNames[i]!=NULL) {
  1669.             FreeVec(c3dsNames[i++]);
  1670.         }
  1671.         FreeVec(c3dsNames);
  1672.         c3dsNames=NULL;
  1673.     }
  1674.  
  1675.     i=0;
  1676.     if(c3dsExt!=NULL) {
  1677.         while(c3dsExt[i]!=NULL) {
  1678.             FreeVec(c3dsExt[i++]);
  1679.         }
  1680.         FreeVec(c3dsExt);
  1681.         c3dsExt=NULL;
  1682.     }
  1683.  
  1684.     // 3d load libraries
  1685.     i=0;
  1686.     if(c3dlLib!=NULL) {
  1687.         while(c3dlLib[i]!=NULL) {
  1688.             FreeVec(c3dlLib[i++]);
  1689.         }
  1690.         FreeVec(c3dlLib);
  1691.         c3dlLib=NULL;
  1692.     }
  1693.  
  1694.     i=0;
  1695.     if(c3dlNames!=NULL) {
  1696.         while(c3dlNames[i]!=NULL) {
  1697.             FreeVec(c3dlNames[i++]);
  1698.         }
  1699.         FreeVec(c3dlNames);
  1700.         c3dlNames=NULL;
  1701.     }
  1702. }
  1703.  
  1704. /****** td.library/tdSpaceNew ******************************************
  1705. *   NAME    
  1706. *     tdSpaceNew -- Creates a new space
  1707. *   SYNOPSIS
  1708. *    spacehandle = tdSpaceNew( )
  1709. *              
  1710. *
  1711. *    ULONG tdSpaceNew
  1712. *         ( );
  1713. *
  1714. *   FUNCTION
  1715. *    Allocates the memory for a new space, initializes all its contents and
  1716. *    returns a handle to it.
  1717. *    The space becomes a default name and a default copyright.
  1718. *
  1719. *   You have to delete the space after usage with tdSpaceDelete().
  1720. *
  1721. *   INPUTS
  1722. *   RESULT
  1723. *     spacehandle - A handle to the new space, or 0 in error case, which means
  1724. *                  that there is not enough memory available.
  1725. *   EXAMPLE
  1726. *
  1727. *   NOTES
  1728. *
  1729. *   BUGS
  1730. *   SEE ALSO
  1731. *     tdSpaceDelete()
  1732. *
  1733. *****************************************************************************
  1734. *
  1735. */
  1736. ULONG __saveds ASM tdSpaceNew() {
  1737.     TDspace     *space=NULL;
  1738.     UBYTE        buffer[20];
  1739.  
  1740.     space = AllocMem(sizeof(TDspace),MEMF_FAST);
  1741.     if (space==NULL) return(0);
  1742.  
  1743.     // initialize the pool headers and other pointers
  1744.     space->matblockspool=NULL;
  1745.     space->objectblockspool=NULL;
  1746.  
  1747.     space->name=NULL;
  1748.  
  1749.     // create a memory pool for the material block lists of this this space
  1750.     // ground size of a pool is one block of materials
  1751.     space->matblockspool=CreatePool(MEMF_FAST,sizeof(TDmaterialblock),sizeof(TDmaterialblock));
  1752.     if(space->matblockspool==NULL) {
  1753.         spaceClean(space);
  1754.         return(0);
  1755.     }
  1756.  
  1757.     // create a memory pool for the object block lists of this this space
  1758.     // ground size of a pool is one block of object
  1759.     space->objectblockspool=CreatePool(MEMF_FAST,sizeof(TDobjectblock),sizeof(TDobjectblock));
  1760.     if(space->objectblockspool==NULL) {
  1761.         spaceClean(space);
  1762.         return(0);
  1763.     }
  1764.  
  1765.     space->name=NULL;
  1766.     strcpy(buffer,"tdSPACE");
  1767.     space->name = AllocVec(strlen(buffer)+1,MEMF_FAST);
  1768.     if (space->name==NULL) {
  1769.         spaceClean(space);
  1770.         return(0);
  1771.     }
  1772.     strcpy(space->name,buffer);
  1773.     
  1774.     space->bBox.left=0.0;
  1775.     space->bBox.right=0.0;
  1776.     space->bBox.front=0.0;
  1777.     space->bBox.rear=0.0;
  1778.     space->bBox.top=0.0;
  1779.     space->bBox.bottom=0.0;
  1780.  
  1781.     space->curmatn=NULL;
  1782.     space->curobjn=NULL;
  1783.  
  1784.     space->objects.numberOfObjects=0;    
  1785.     space->materials.numberOfMaterials=0;
  1786.  
  1787.     space->ctm.sx=1,space->ctm.sy=1,space->ctm.sz=1;
  1788.     space->ctm.rx=0,space->ctm.ry=0,space->ctm.rz=0;
  1789.     space->ctm.m[0][0]=1,space->ctm.m[1][0]=0,space->ctm.m[2][0]=0,space->ctm.m[3][0]=0;
  1790.     space->ctm.m[0][1]=0,space->ctm.m[1][1]=1,space->ctm.m[2][1]=0,space->ctm.m[3][1]=0;
  1791.     space->ctm.m[0][2]=0,space->ctm.m[1][2]=0,space->ctm.m[2][2]=1,space->ctm.m[3][2]=0;
  1792.     space->ctm.m[0][3]=0,space->ctm.m[1][3]=0,space->ctm.m[2][3]=0,space->ctm.m[3][3]=1;
  1793.  
  1794.     return(ULONG)space;
  1795. }
  1796.  
  1797. /****** td.library/tdSpaceDelete ******************************************
  1798. *   NAME    
  1799. *     tdSpaceDelete -- Delete a space which was created whith tdSpaceNew().
  1800. *   SYNOPSIS
  1801. *    error = tdSpaceDelete( spacehandle )
  1802. *                           D1
  1803. *
  1804. *    TDerrors tdSpaceDelete
  1805. *         ( ULONG );
  1806. *
  1807. *   FUNCTION
  1808. *    Free the memory occupied by the space and all its components.
  1809. *   INPUTS
  1810. *     spacehandle    - A valid handle of a space.
  1811. *    
  1812. *   RESULT
  1813. *     error - ER_NOERROR if all went well.
  1814. *            ER_NOSPACE if the handle is not valid.
  1815. *
  1816. *   EXAMPLE
  1817. *   NOTES
  1818. *
  1819. *   BUGS
  1820. *   SEE ALSO
  1821. *     tdSpaceNew()
  1822. ******************************************************************************
  1823. *
  1824. */
  1825. TDerrors __saveds ASM tdSpaceDelete(register __d1 ULONG spacehandle) {
  1826.     TDspace                    *space=NULL;
  1827.     TDmaterialnode                *mat=NULL;
  1828.     TDobjectnode                *object=NULL;
  1829.     ULONG                        i;
  1830.  
  1831.     space=(TDspace *) spacehandle;
  1832.     if(space==NULL) return(ER_NOSPACE);
  1833.  
  1834.     /*
  1835.     ** Free the name string
  1836.     */
  1837.     FreeVec(space->name);
  1838.  
  1839.     /*
  1840.     ** Free the objects and the nodeslist
  1841.     */
  1842.     for(i=1;i<=space->objects.numberOfObjects;i++) {
  1843.         object=getObjectNode(space,i);
  1844.  
  1845.         FreeVec(object->name);
  1846.  
  1847.         switch(object->type) {
  1848.             case TD_CUBE :
  1849.                 FreeMem((TDcube *)object->handle,sizeof(TDcube));
  1850.                 break;
  1851.             case TD_POLYMESH :
  1852.                 delPolyMesh((TDpolymesh *)object->handle);
  1853.                 break;
  1854.             case TD_TEXBINDING :
  1855.                 FreeMem((TDtexbinding *)object->handle,sizeof(TDtexbinding));
  1856.                 break;
  1857.         }
  1858.  
  1859.         FreeMem(object,sizeof(TDobjectnode));
  1860.     }
  1861.     DeletePool(space->objectblockspool);
  1862.  
  1863.     /*
  1864.     ** Free the materials and the nodeslist
  1865.     */
  1866.     for(i=1;i<=space->materials.numberOfMaterials;i++) {
  1867.         mat=getMaterialNode(space,i);
  1868.  
  1869.         FreeVec(mat->name);
  1870.  
  1871.         switch(mat->type) {
  1872.             case TD_SURFACE :
  1873.                 FreeMem((TDsurface *)mat->handle,sizeof(TDsurface));
  1874.                 break;
  1875.             case TD_TEXTURE :
  1876.                 FreeMem((TDtexture *)mat->handle,sizeof(TDtexture));
  1877.                 break;
  1878.         }
  1879.  
  1880.         FreeMem(mat,sizeof(TDmaterialnode));
  1881.     }
  1882.     DeletePool(space->matblockspool);
  1883.  
  1884.     /*
  1885.     ** Free the space itself
  1886.     */
  1887.     FreeMem(space,sizeof(TDspace));
  1888.  
  1889.     return(ER_NOERROR);
  1890. }
  1891.  
  1892. /****** td.library/tdNameSet ******************************************
  1893. *   NAME    
  1894. *     tdNameSet -- Set the name of component.
  1895. *   SYNOPSIS
  1896. *    error = tdNameSet( spacehandle,type,index,name )
  1897. *                       D1          D2   D3    D4
  1898. *
  1899. *    TDerrors tdSpaceNameSet
  1900. *         ( ULONG,TDenum,ULONG,STRPTR );
  1901. *
  1902. *   FUNCTION
  1903. *    A copy of the passed string will be made and assigned to the
  1904. *    name string of the specified component of this space.
  1905. *   INPUTS
  1906. *     spacehandle     - A valid handle of a space.
  1907. *    type            - The component its type.
  1908. *    index           - The component its index.
  1909. *    name            - String which contains the name.
  1910. *    
  1911. *   RESULT
  1912. *     error - ER_NOERROR  if all went well.
  1913. *            ER_NOSPACE  if the handle is not valid.
  1914. *            ER_NOTYPE   if the type is not valid.
  1915. *            ER_NOINDEX  if the index is not valid.
  1916. *             ER_NOMEMORY if there is not enough memory.
  1917. *
  1918. *   EXAMPLE
  1919. *    error = tdNameSet(spacehandle,TD_MATERIAL,3,"purple red");
  1920. *
  1921. *   NOTES
  1922. *    This function can be called as often as you need, which will
  1923. *    replace the old value.
  1924. *
  1925. *    When changing the name of a space, the index will not be
  1926. *    used, as the space is already known.
  1927. *
  1928. *    Not all formats support names, and the written length of the
  1929. *    string depends of the format too.
  1930. *
  1931. *   BUGS
  1932. *   SEE ALSO
  1933. *     tdNameGet()
  1934. ******************************************************************************
  1935. *
  1936. */
  1937. TDerrors __saveds ASM tdNameSet(register __d1 ULONG spacehandle,
  1938.                                 register __d2 TDenum type,
  1939.                                 register __d3 ULONG index,
  1940.                                 register __d4 STRPTR name ) {
  1941.  
  1942.     TDspace        *space=NULL;
  1943.     TDmaterialnode    *mat=NULL;
  1944.     TDobjectnode    *object=NULL;
  1945.   
  1946.     space=(TDspace *) spacehandle;
  1947.     if (space==NULL) return(ER_NOSPACE);
  1948.  
  1949.     // check which component has to be affected
  1950.     switch(type) {
  1951.         case TD_SPACE :
  1952.             // if the name was already set before, free it
  1953.             if(space->name) FreeVec(space->name);
  1954.             space->name=NULL;
  1955.  
  1956.             space->name=(STRPTR) AllocVec(strlen(name)+1,MEMF_FAST);
  1957.             if(space->name==NULL) return(ER_NOMEMORY);
  1958.   
  1959.             strcpy(space->name,name);
  1960.  
  1961.             break;
  1962.         case TD_MATERIAL :
  1963.             mat=getMaterialNode(space,index);
  1964.             if(mat==NULL) return(ER_NOINDEX);
  1965.  
  1966.             // If the name was already set before, free it
  1967.             if (mat->name) FreeVec(mat->name);
  1968.             mat->name=NULL;
  1969.     
  1970.             mat->name=(STRPTR) AllocVec(strlen(name)+1,MEMF_FAST);
  1971.             if(mat->name==NULL) return(ER_NOMEMORY);
  1972.   
  1973.             strcpy(mat->name,name);
  1974.  
  1975.             break;
  1976.         case TD_OBJECT :
  1977.             object=getObjectNode(space,index);
  1978.             if(object==NULL) return(ER_NOINDEX);
  1979.  
  1980.             // If the name was already set before, free it
  1981.             if (object->name) FreeVec(object->name);
  1982.             object->name=NULL;
  1983.     
  1984.             object->name=(STRPTR) AllocVec(strlen(name)+1,MEMF_FAST);
  1985.             if(object->name==NULL) return(ER_NOMEMORY);
  1986.   
  1987.             strcpy(object->name,name);
  1988.  
  1989.             break;
  1990.         default :
  1991.             return(ER_NOTYPE);
  1992.     }
  1993.  
  1994.     return(ER_NOERROR);
  1995. }
  1996.  
  1997. /****** td.library/tdNameGet ******************************************
  1998. *   NAME    
  1999. *     tdNameGet -- Get the name of a component.
  2000. *
  2001. *   SYNOPSIS
  2002. *    error = tdNameGet( spacehandle,type,index,name )
  2003. *                       D1          D2   D3    D4
  2004. *
  2005. *    TDerrors tdNameGet
  2006. *         ( ULONG,TDenum,ULONG,STRPTR * );
  2007. *
  2008. *   FUNCTION
  2009. *    You will get a pointer to the name of the component.
  2010. *    This string is READ_ONLY and only valid as long the
  2011. *    as the component exists.
  2012. *   INPUTS
  2013. *     spacehandle     - A valid handle of a space.
  2014. *    type            - The component its type.
  2015. *    index           - The component its index.
  2016. *    name            - Pointer to the name of the component.
  2017. *    
  2018. *   RESULT
  2019. *     error - ER_NOERROR  if all went well.
  2020. *            ER_NOSPACE  if the handle is not valid.
  2021. *            ER_NOTYPE   if the type is not valid.
  2022. *            ER_NOINDEX  if the index is not valid.
  2023. *   EXAMPLE
  2024. *    error = tdNameGet(spacehandle,TD_SPACE,0,&mystring);
  2025. *
  2026. *   NOTES
  2027. *    When you will get the name of a space, the index will not be
  2028. *    used, as the space is already known.
  2029. *
  2030. *   BUGS
  2031. *   SEE ALSO
  2032. *     tdNameSet()
  2033. ******************************************************************************
  2034. *
  2035. */
  2036. TDerrors __saveds ASM tdNameGet(register __d1 ULONG spacehandle,
  2037.                                 register __d2 TDenum type,
  2038.                                 register __d3 ULONG index,
  2039.                                 register __d4 STRPTR *name ) {
  2040.  
  2041.     TDspace        *space=NULL;
  2042.     TDmaterialnode    *mat=NULL;
  2043.     TDobjectnode    *object=NULL;
  2044.  
  2045.     // initialize the name to NULL
  2046.     (*name)=NULL;
  2047.   
  2048.     space=(TDspace *) spacehandle;
  2049.     if (space==NULL) return(ER_NOSPACE);
  2050.  
  2051.     // check which component has to be affected
  2052.     switch(type) {
  2053.         case TD_SPACE :
  2054.             (*name)=space->name;
  2055.  
  2056.             break;
  2057.         case TD_MATERIAL :
  2058.             mat=getMaterialNode(space,index);
  2059.             if(mat==NULL) return(ER_NOINDEX);
  2060.  
  2061.             (*name)=mat->name;
  2062.  
  2063.             break;
  2064.         case TD_OBJECT :
  2065.             object=getObjectNode(space,index);
  2066.             if(object==NULL) return(ER_NOINDEX);
  2067.  
  2068.             (*name)=object->name;
  2069.  
  2070.             break;
  2071.         default :
  2072.             return(ER_NOTYPE);
  2073.     }
  2074.  
  2075.     return(ER_NOERROR);
  2076. }
  2077.  
  2078. /****** td.library/tdAdd ******************************************
  2079. *   NAME    
  2080. *     tdAdd -- Add a new component to the space.
  2081. *
  2082. *   SYNOPSIS
  2083. *    error = tdAdd( spacehandle,type )
  2084. *                   D1          D2
  2085. *
  2086. *    TDerrors tdAdd
  2087. *         ( ULONG,TDenum );
  2088. *
  2089. *   FUNCTION
  2090. *    A new component will be created and added to the space.
  2091. *    You can access the component by its index which will
  2092. *    be the last of its type.
  2093. *
  2094. *    All properties will be set to default, strings too.
  2095. *   INPUTS
  2096. *     spacehandle     - A valid handle of a space.
  2097. *    type            - The component its type.
  2098. *    
  2099. *   RESULT
  2100. *     error - ER_NOERROR  if all went well.
  2101. *            ER_NOSPACE  if the handle is not valid.
  2102. *            ER_NOTYPE   if the type is not valid.
  2103. *            ER_NOMEMORY if there is not enough memory. 
  2104. *   EXAMPLE
  2105. *    error = tdAdd(spacehandle,TD_SURFACE);
  2106. *
  2107. *   NOTES
  2108. *
  2109. *   BUGS
  2110. *   SEE ALSO
  2111. ******************************************************************************
  2112. *
  2113. */
  2114. TDerrors __saveds ASM tdAdd(register __d1 ULONG spacehandle,register __d2 TDenum type) {
  2115.     TDspace        *space=NULL;
  2116.  
  2117.     space=(TDspace *) spacehandle;
  2118.     if (space==NULL) return(ER_NOSPACE);
  2119.  
  2120.     // check which component has to be affected
  2121.     switch(type) {
  2122.         case TD_SURFACE :
  2123.         case TD_TEXTURE :
  2124.             if(addMaterialNode(space,type)==0) return(ER_NOMEMORY);
  2125.  
  2126.             break;
  2127.         case TD_CUBE :
  2128.         case TD_POLYMESH :
  2129.         case TD_TEXBINDING :
  2130.             if(addObjectNode(space,type)==0) return(ER_NOMEMORY);
  2131.  
  2132.             break;
  2133.         default :
  2134.             return(ER_NOTYPE);
  2135.     }
  2136.  
  2137.     return(ER_NOERROR);
  2138. }
  2139.  
  2140. /****** td.library/tdNofGet ******************************************
  2141. *   NAME    
  2142. *     tdNofGet -- Get the number of specific components in
  2143. *                the space or a child.
  2144. *   SYNOPSIS
  2145. *    number = tdNofGet( spacehandle,type )
  2146. *                       D1          D2
  2147. *
  2148. *    ULONG tdNofGet
  2149. *         ( ULONG,TDenum )
  2150. *
  2151. *   FUNCTION
  2152. *    The current number of components of the specified type in the
  2153. *    space or a child will be returned.
  2154. *   INPUTS
  2155. *     spacehandle     - A valid handle of a space.
  2156. *    type            - The component its type.
  2157. *    
  2158. *   RESULT
  2159. *     number - Number of components, 0 if none or no valid space or
  2160. *             component.
  2161. *
  2162. *   EXAMPLE
  2163. *    number = tdNofGet(spacehandle,TD_MATERIAL);
  2164. *
  2165. *   NOTES
  2166. *
  2167. *   BUGS
  2168. *   SEE ALSO
  2169. ******************************************************************************
  2170. *
  2171. */
  2172. ULONG __saveds ASM tdNofGet(register __d1 ULONG spacehandle,
  2173.                             register __d2 TDenum type) {
  2174.     TDspace        *space=NULL;
  2175.     TDmaterialnode    *mat=NULL;
  2176.     TDpolymesh        *polymesh=NULL;
  2177.  
  2178.     space=(TDspace *) spacehandle;
  2179.     if (space==NULL) return(0);
  2180.  
  2181.     // check which component has to be affected
  2182.     switch(type) {
  2183.         case TD_MATERIAL :
  2184.             return(space->materials.numberOfMaterials);
  2185.  
  2186.             break;
  2187.         case TD_OBJECT :
  2188.             return(space->objects.numberOfObjects);
  2189.  
  2190.             break;
  2191.         case TD_MATGROUP :
  2192.             if(space->curobjn==NULL) return(0);
  2193.             if(space->curobjn->type!=TD_POLYMESH) return(0);
  2194.  
  2195.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  2196.             return(polymesh->matgroups.numberOfMatGroups);
  2197.  
  2198.             break;
  2199.         case TD_POLYGON :
  2200.             if(space->curobjn==NULL) return(0);
  2201.             if(space->curobjn->type!=TD_POLYMESH) return(0);
  2202.  
  2203.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  2204.             if(polymesh->curmatgroupn==NULL) return(polymesh->matgroups.numberOfPolygons);
  2205.             else return(polymesh->curmatgroupn->polygons.numberOfPolygons);
  2206.             
  2207.             break;
  2208.         case TD_VERTEX :
  2209.             if(space->curobjn==NULL) return(0);
  2210.             if(space->curobjn->type!=TD_POLYMESH) return(0);
  2211.  
  2212.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  2213.             if(polymesh->curmatgroupn==NULL) return(polymesh->vertices.numberOfVertices);
  2214.             else if(polymesh->curpolyn==NULL) return(polymesh->curmatgroupn->polygons.numberOfVertices);
  2215.             else return(polymesh->curpolyn->numberOfVertices);
  2216.  
  2217.             break;
  2218.     }
  2219.  
  2220.     return(0);
  2221. }
  2222.  
  2223. /****** td.library/tdMaterialSetuba ******************************************
  2224. *   NAME    
  2225. *     tdMaterialSetuba -- Set a parameter of the a material.
  2226. *   SYNOPSIS
  2227. *    error = tdMaterialSetuba( spacehandle,type,index,array )
  2228. *                              D1          D2   D3    A0
  2229. *
  2230. *    TDerrors tdMaterialSetuba
  2231. *         ( ULONG,TDenum,ULONG,UBYTE * );
  2232. *
  2233. *   FUNCTION
  2234. *    The parameter of the material at index, will be changed.
  2235. *    Type specifies which parameter. The array its size is dependend
  2236. *    of the type.
  2237. *   INPUTS
  2238. *     spacehandle     - A valid handle of a space.
  2239. *    type            - The parameter its type.
  2240. *    index           - The material its index.
  2241. *    array           - Array which contains the values.
  2242. *    
  2243. *   RESULT
  2244. *     error - ER_NOERROR  if all went well.
  2245. *            ER_NOSPACE  if the handle is not valid.
  2246. *            ER_NOTYPE   if the type is not valid.
  2247. *            ER_NOINDEX  if the index is not valid.
  2248. *
  2249. *   EXAMPLE
  2250. *    error = tdMaterialSetuba(spacehandle,TD_AMBIENT,3,red);
  2251. *
  2252. *   NOTES
  2253. *    If a value is out of range it will be set to its possible
  2254. *    maximum or minimum.
  2255. *
  2256. *   BUGS
  2257. *   SEE ALSO
  2258. *     tdMaterialGet()
  2259. ******************************************************************************
  2260. *
  2261. */
  2262. TDerrors __saveds ASM tdMaterialSetuba(register __d1 ULONG spacehandle,
  2263.                                         register __d2 TDenum type,
  2264.                                         register __d3 ULONG index,
  2265.                                         register __a0 UBYTE *array) {
  2266.     TDspace        *space=NULL;
  2267.     TDmaterialnode    *mat=NULL;
  2268.     TDsurface        *surf=NULL;
  2269.     TDtexture        *tex=NULL;
  2270.     UBYTE            *marray=NULL;
  2271.     TDcolorub        color;
  2272.  
  2273.     // make a copy of the array, because a0 is a scratch register
  2274.     marray = array;
  2275.  
  2276.     space=(TDspace *) spacehandle;
  2277.     if (space==NULL) return(ER_NOSPACE);
  2278.  
  2279.     mat=getMaterialNode(space,index);
  2280.     if(mat==NULL) return(ER_NOINDEX);
  2281.  
  2282.     // do this in function of the material type
  2283.     switch(mat->type) {
  2284.         case TD_SURFACE :
  2285.             surf=(TDsurface *)mat->handle;
  2286.  
  2287.             // check which parameter has to be changed
  2288.             switch(type) {
  2289.                 case TD_AMBIENT :
  2290.                     color.r=marray[0];
  2291.                     color.g=marray[1];
  2292.                     color.b=marray[2];
  2293.  
  2294.                     surf->ambientColor=color;
  2295.  
  2296.                     break;
  2297.                 case TD_DIFFUSE :
  2298.                     color.r=marray[0];
  2299.                     color.g=marray[1];
  2300.                     color.b=marray[2];
  2301.  
  2302.                     surf->diffuseColor=color;
  2303.  
  2304.                     break;
  2305.                 case TD_SHININESS :
  2306.                     surf->shininess=marray[0];
  2307.                     surf->shininess/=255;
  2308.  
  2309.                     break;
  2310.                 case TD_TRANSPARENCY :
  2311.                     surf->transparency=marray[0];
  2312.                     surf->transparency/=255;
  2313.  
  2314.                     break;
  2315.                 default :
  2316.                     return(ER_NOTYPE);
  2317.             }
  2318.             break;
  2319.  
  2320.         case TD_TEXTURE :
  2321.             tex=(TDtexture *)mat->handle;
  2322.             break;
  2323.  
  2324.     }
  2325.     return(ER_NOERROR);
  2326. }
  2327.  
  2328. /****** td.library/tdMaterialGetuba ******************************************
  2329. *   NAME    
  2330. *     tdMaterialGetuba -- Get a parameter of the a material.
  2331. *   SYNOPSIS
  2332. *    error = tdMaterialGetuba( spacehandle,type,index,array )
  2333. *                              D1          D2   D3    A0
  2334. *
  2335. *    TDerrors tdMaterialGetuba
  2336. *         ( ULONG,TDenum,ULONG,UBYTE * );
  2337. *
  2338. *   FUNCTION
  2339. *    The parameter of the material at index, will be returned.
  2340. *    Type specifies which parameter. The array its size is dependend
  2341. *    of the type.
  2342. *   INPUTS
  2343. *     spacehandle     - A valid handle of a space.
  2344. *    type            - The parameter its type.
  2345. *    index           - The material its index.
  2346. *    array           - Pointer to a correct sized array, which
  2347. *                      will contain the values.
  2348. *    
  2349. *   RESULT
  2350. *     error - ER_NOERROR  if all went well.
  2351. *            ER_NOSPACE  if the handle is not valid.
  2352. *            ER_NOTYPE   if the type is not valid.
  2353. *            ER_NOINDEX  if the index is not valid.
  2354. *
  2355. *   EXAMPLE
  2356. *    error = tdMaterialGetuba(spacehandle,TD_AMBIENT,3,colorarray);
  2357. *
  2358. *   NOTES
  2359. *
  2360. *   BUGS
  2361. *   SEE ALSO
  2362. *     tdMaterialSet()
  2363. ******************************************************************************
  2364. *
  2365. */
  2366. TDerrors __saveds ASM tdMaterialGetuba(register __d1 ULONG spacehandle,
  2367.                                         register __d2 TDenum type,
  2368.                                         register __d3 ULONG index,
  2369.                                         register __a0 UBYTE *array) {
  2370.     TDspace        *space=NULL;
  2371.     TDmaterialnode    *mat=NULL;
  2372.     TDsurface        *surf=NULL;
  2373.     TDtexture        *tex=NULL;
  2374.     UBYTE            *marray=NULL;
  2375.  
  2376.     // make a copy of the array, because a0 is a scratch register
  2377.     marray = array;
  2378.  
  2379.     space=(TDspace *) spacehandle;
  2380.     if (space==NULL) return(ER_NOSPACE);
  2381.  
  2382.     mat=getMaterialNode(space,index);
  2383.     if(mat==NULL) return(ER_NOINDEX);
  2384.  
  2385.     // do this in function of the material type
  2386.     switch(mat->type) {
  2387.         case TD_SURFACE :
  2388.             surf=(TDsurface *)mat->handle;
  2389.  
  2390.             // check which parameter has to be returned
  2391.             switch(type) {
  2392.                 case TD_AMBIENT :
  2393.                     marray[0]=surf->ambientColor.r;
  2394.                     marray[1]=surf->ambientColor.g;
  2395.                     marray[2]=surf->ambientColor.b;
  2396.  
  2397.                     break;
  2398.                 case TD_DIFFUSE :
  2399.                     marray[0]=surf->diffuseColor.r;
  2400.                     marray[1]=surf->diffuseColor.g;
  2401.                     marray[2]=surf->diffuseColor.b;
  2402.  
  2403.                     break;
  2404.                 case TD_SHININESS :
  2405.                     marray[0]=UBYTE(surf->shininess*255);
  2406.  
  2407.                     break;
  2408.                 case TD_TRANSPARENCY :
  2409.                     marray[0]=UBYTE(surf->transparency*255);
  2410.  
  2411.                     break;
  2412.                 default :
  2413.                     return(ER_NOTYPE);
  2414.             }
  2415.             break;
  2416.  
  2417.         case TD_TEXTURE :
  2418.             tex=(TDtexture *)mat->handle;
  2419.     
  2420.             break;
  2421.  
  2422.     }
  2423.  
  2424.     return(ER_NOERROR);
  2425. }
  2426.  
  2427. /****** td.library/tdMaterialSetfa ******************************************
  2428. *   NAME    
  2429. *     tdMaterialSetfa -- Set a parameter of the a material.
  2430. *   SYNOPSIS
  2431. *    error = tdMaterialSetfa( spacehandle,type,index,array )
  2432. *                             D1          D2   D3     A0
  2433. *
  2434. *    TDerrors tdMaterialSetfa
  2435. *         ( ULONG,TDenum,ULONG,TDfloat * );
  2436. *
  2437. *   FUNCTION
  2438. *    The parameter of the material at index, will be changed.
  2439. *    Type specifies which parameter. The array its size is dependend
  2440. *    of the type.
  2441. *   INPUTS
  2442. *     spacehandle     - A valid handle of a space.
  2443. *    type            - The parameter its type.
  2444. *    index           - The material its index.
  2445. *    array           - Array which contains the values.
  2446. *    
  2447. *   RESULT
  2448. *     error - ER_NOERROR  if all went well.
  2449. *            ER_NOSPACE  if the handle is not valid.
  2450. *            ER_NOTYPE   if the type is not valid.
  2451. *            ER_NOINDEX  if the index is not valid.
  2452. *
  2453. *   EXAMPLE
  2454. *    error = tdMaterialSetfa(spacehandle,TD_DIFFUSE,7,red);
  2455. *
  2456. *   NOTES
  2457. *    If a value is out of range it will be set to its possible
  2458. *    maximum or minimum.
  2459. *
  2460. *   BUGS
  2461. *   SEE ALSO
  2462. *     tdMaterialGet()
  2463. ******************************************************************************
  2464. *
  2465. */
  2466. TDerrors __saveds ASM tdMaterialSetfa(register __d1 ULONG spacehandle,
  2467.                                         register __d2 TDenum type,
  2468.                                         register __d3 ULONG index,
  2469.                                         register __a0 TDfloat *array) {
  2470.     TDspace        *space=NULL;
  2471.     TDmaterialnode    *mat=NULL;
  2472.     TDsurface        *surf=NULL;
  2473.     TDtexture        *tex=NULL;
  2474.     TDfloat        *marray=NULL;
  2475.     TDcolorub        color;
  2476.  
  2477.     // make a copy of the array, because a0 is a scratch register
  2478.     marray = array;
  2479.  
  2480.     space=(TDspace *) spacehandle;
  2481.     if (space==NULL) return(ER_NOSPACE);
  2482.  
  2483.     mat=getMaterialNode(space,index);
  2484.     if(mat==NULL) return(ER_NOINDEX);
  2485.  
  2486.     // do this in function of the material type
  2487.     switch(mat->type) {
  2488.         case TD_SURFACE :
  2489.             surf=(TDsurface *)mat->handle;
  2490.  
  2491.             // check which parameter has to be changed
  2492.             switch(type) {
  2493.                 case TD_AMBIENT :
  2494.                     color.r=UBYTE(marray[0]*255);
  2495.                     color.g=UBYTE(marray[1]*255);
  2496.                     color.b=UBYTE(marray[2]*255);
  2497.  
  2498.                     surf->ambientColor=color;
  2499.  
  2500.                     break;
  2501.                 case TD_DIFFUSE :
  2502.                     color.r=UBYTE(marray[0]*255);
  2503.                     color.g=UBYTE(marray[1]*255);
  2504.                     color.b=UBYTE(marray[2]*255);
  2505.  
  2506.                     surf->diffuseColor=color;
  2507.  
  2508.                     break;
  2509.                 case TD_SHININESS :
  2510.                     if(marray[0]>1.0) surf->shininess=1.0;
  2511.                     else if (marray[0]<0.0) surf->shininess=0.0;
  2512.                     else surf->shininess=marray[0];
  2513.  
  2514.                     break;
  2515.                 case TD_TRANSPARENCY :
  2516.                     if(marray[0]>1.0) surf->transparency=1.0;
  2517.                     else if (marray[0]<0.0) surf->transparency=0.0;
  2518.                     else surf->transparency=marray[0];
  2519.  
  2520.                     break;
  2521.                 default :
  2522.                     return(ER_NOTYPE);
  2523.             }
  2524.             break;
  2525.  
  2526.         case TD_TEXTURE :
  2527.             tex=(TDtexture *)mat->handle;
  2528.  
  2529.             break;
  2530.     }
  2531.  
  2532.     return(ER_NOERROR);
  2533. }
  2534.  
  2535. /****** td.library/tdMaterialGetfa ******************************************
  2536. *   NAME    
  2537. *     tdMaterialGetfa -- Get a parameter of the a material.
  2538. *   SYNOPSIS
  2539. *    error = tdMaterialGetfa( spacehandle,type,index,array )
  2540. *                             D1          D2   D3     A0
  2541. *
  2542. *    TDerrors tdMaterialGetfa
  2543. *         ( ULONG,TDenum,ULONG,TDfloat * );
  2544. *
  2545. *   FUNCTION
  2546. *    The parameter of the material at index, will be returned.
  2547. *    Type specifies which parameter. The array its size is dependend
  2548. *    of the type.
  2549. *   INPUTS
  2550. *     spacehandle     - A valid handle of a space.
  2551. *    type            - The parameter its type.
  2552. *    index           - The material its index.
  2553. *    array           - Pointer to a correct sized array, which
  2554. *                      will contain the values.
  2555. *    
  2556. *   RESULT
  2557. *     error - ER_NOERROR  if all went well.
  2558. *            ER_NOSPACE  if the handle is not valid.
  2559. *            ER_NOTYPE   if the type is not valid.
  2560. *            ER_NOINDEX  if the index is not valid.
  2561. *
  2562. *   EXAMPLE
  2563. *    error = tdMaterialGetfa(spacehandle,TD_DIFFUSE,7,colorarray);
  2564. *
  2565. *   NOTES
  2566. *
  2567. *   BUGS
  2568. *   SEE ALSO
  2569. *     tdMaterialSet()
  2570. ******************************************************************************
  2571. *
  2572. */
  2573. TDerrors __saveds ASM tdMaterialGetfa(register __d1 ULONG spacehandle,
  2574.                                         register __d2 TDenum type,
  2575.                                         register __d3 ULONG index,
  2576.                                         register __a0 TDfloat *array) {
  2577.     TDspace        *space=NULL;
  2578.     TDmaterialnode    *mat=NULL;
  2579.     TDsurface        *surf=NULL;
  2580.     TDtexture        *tex=NULL;
  2581.     TDfloat        *marray=NULL;
  2582.  
  2583.     // make a copy of the array, because a0 is a scratch register
  2584.     marray = array;
  2585.  
  2586.     space=(TDspace *) spacehandle;
  2587.     if (space==NULL) return(ER_NOSPACE);
  2588.  
  2589.     mat=getMaterialNode(space,index);
  2590.     if(mat==NULL) return(ER_NOINDEX);
  2591.  
  2592.     // do this in function of the material type
  2593.     switch(mat->type) {
  2594.         case TD_SURFACE :
  2595.             surf=(TDsurface *)mat->handle;
  2596.  
  2597.             // check which parameter has to be returned
  2598.             switch(type) {
  2599.                 case TD_AMBIENT :
  2600.                     marray[0]=surf->ambientColor.r;
  2601.                     marray[0]/=255;
  2602.                     marray[1]=surf->ambientColor.g;
  2603.                     marray[1]/=255;
  2604.                     marray[2]=surf->ambientColor.b;
  2605.                     marray[2]/=255;
  2606.  
  2607.                     break;
  2608.                 case TD_DIFFUSE :
  2609.                     marray[0]=surf->diffuseColor.r;
  2610.                     marray[0]/=255;
  2611.                     marray[1]=surf->diffuseColor.g;
  2612.                     marray[1]/=255;
  2613.                     marray[2]=surf->diffuseColor.b;
  2614.                     marray[2]/=255;
  2615.  
  2616.                     break;
  2617.                 case TD_SHININESS :
  2618.                     marray[0]=surf->shininess;
  2619.  
  2620.                     break;
  2621.                 case TD_TRANSPARENCY :
  2622.                     marray[0]=surf->transparency;
  2623.  
  2624.                     break;
  2625.                 default :
  2626.                     return(ER_NOTYPE);
  2627.             }
  2628.             break;
  2629.  
  2630.         case TD_TEXTURE :
  2631.             tex=(TDtexture *)mat->handle;
  2632.     
  2633.             break;
  2634.     }
  2635.  
  2636.     return(ER_NOERROR);
  2637. }
  2638.  
  2639. /****** td.library/tdMaterialSetf ******************************************
  2640. *   NAME    
  2641. *     tdMaterialSetf -- Set a single value parameter of the a material.
  2642. *   SYNOPSIS
  2643. *    error = tdMaterialSetf( spacehandle,type,index,value )
  2644. *                            D1          D2   D3    D4
  2645. *
  2646. *    TDerrors tdMaterialSetf
  2647. *         ( ULONG,TDenum,ULONG,TDfloat );
  2648. *
  2649. *   FUNCTION
  2650. *    A single value parameter of the material at index, will be changed.
  2651. *    Type specifies which parameter.
  2652. *   INPUTS
  2653. *     spacehandle     - A valid handle of a space.
  2654. *    type            - The parameter its type.
  2655. *    index           - The material its index.
  2656. *    value           - New value of the parameter.
  2657. *    
  2658. *   RESULT
  2659. *     error - ER_NOERROR  if all went well.
  2660. *            ER_NOSPACE  if the handle is not valid.
  2661. *            ER_NOTYPE   if the type is not valid.
  2662. *            ER_NOINDEX  if the index is not valid.
  2663. *
  2664. *   EXAMPLE
  2665. *    error = tdMaterialSetf(spacehandle,TD_SHININESS,23,0.4);
  2666. *
  2667. *   NOTES
  2668. *    If a value is out of range it will be set to its possible
  2669. *    maximum or minimum.
  2670. *
  2671. *   BUGS
  2672. *   SEE ALSO
  2673. *     tdMaterialGet()
  2674. ******************************************************************************
  2675. *
  2676. */
  2677. TDerrors __saveds ASM tdMaterialSetf(register __d1 ULONG spacehandle,
  2678.                                     register __d2 TDenum type,
  2679.                                     register __d3 ULONG index,
  2680.                                     register __d4 TDfloat value) {
  2681.     TDspace        *space=NULL;
  2682.     TDmaterialnode    *mat=NULL;
  2683.     TDsurface        *surf=NULL;
  2684.     TDtexture        *tex=NULL;
  2685.  
  2686.     space=(TDspace *) spacehandle;
  2687.     if (space==NULL) return(ER_NOSPACE);
  2688.  
  2689.     mat=getMaterialNode(space,index);
  2690.     if(mat==NULL) return(ER_NOINDEX);
  2691.  
  2692.     // do this in function of the material type
  2693.     switch(mat->type) {
  2694.         case TD_SURFACE :
  2695.             surf=(TDsurface *)mat->handle;
  2696.  
  2697.             // check which parameter has to be changed
  2698.             switch(type) {
  2699.                 case TD_SHININESS :
  2700.                     if(value>1.0) surf->shininess=1.0;
  2701.                     else if (value<0.0) surf->shininess=0.0;
  2702.                     else surf->shininess=value;
  2703.  
  2704.                     break;
  2705.                     case TD_TRANSPARENCY :
  2706.                     if(value>1.0) surf->transparency=1.0;
  2707.                     else if (value<0.0) surf->transparency=0.0;
  2708.                     else surf->transparency=value;
  2709.  
  2710.                     break;
  2711.                 default :
  2712.                     return(ER_NOTYPE);
  2713.             }
  2714.             break;
  2715.  
  2716.         case TD_TEXTURE :
  2717.             tex=(TDtexture *)mat->handle;
  2718.  
  2719.             break;
  2720.     }
  2721.  
  2722.     return(ER_NOERROR);
  2723. }
  2724.  
  2725. /****** td.library/tdMaterialGetf ******************************************
  2726. *   NAME    
  2727. *     tdMaterialGetf -- Get a single value parameter of the a material.
  2728. *   SYNOPSIS
  2729. *    error = tdMaterialGetf( spacehandle,type,index,value )
  2730. *                            D1          D2   D3    D4
  2731. *
  2732. *    TDerrors tdMaterialGetf
  2733. *         ( ULONG,TDenum,ULONG,TDfloat * );
  2734. *
  2735. *   FUNCTION
  2736. *    The single value parameter of the material at index, will be returned.
  2737. *    Type specifies which parameter.
  2738. *   INPUTS
  2739. *     spacehandle     - A valid handle of a space.
  2740. *    type            - The parameter its type.
  2741. *    index           - The material its index.
  2742. *    value           - Pointer to a variable which will contain
  2743. *                      the value.
  2744. *    
  2745. *   RESULT
  2746. *     error - ER_NOERROR  if all went well.
  2747. *            ER_NOSPACE  if the handle is not valid.
  2748. *            ER_NOTYPE   if the type is not valid.
  2749. *            ER_NOINDEX  if the index is not valid.
  2750. *
  2751. *   EXAMPLE
  2752. *    error = tdMaterialGetf(spacehandle,TD_SHININESS,23,&shininess);
  2753. *
  2754. *   NOTES
  2755. *
  2756. *   BUGS
  2757. *   SEE ALSO
  2758. *     tdMaterialSet()
  2759. ******************************************************************************
  2760. *
  2761. */
  2762. TDerrors __saveds ASM tdMaterialGetf(register __d1 ULONG spacehandle,
  2763.                                     register __d2 TDenum type,
  2764.                                     register __d3 ULONG index,
  2765.                                     register __d4 TDfloat *value) {
  2766.     TDspace        *space=NULL;
  2767.     TDmaterialnode    *mat=NULL;
  2768.     TDsurface        *surf=NULL;
  2769.     TDtexture        *tex=NULL;
  2770.  
  2771.     space=(TDspace *) spacehandle;
  2772.     if (space==NULL) return(ER_NOSPACE);
  2773.  
  2774.     mat=getMaterialNode(space,index);
  2775.     if(mat==NULL) return(ER_NOINDEX);
  2776.  
  2777.     // do this in function of the material type
  2778.     switch(mat->type) {
  2779.         case TD_SURFACE :
  2780.             surf=(TDsurface *)mat->handle;
  2781.  
  2782.             // check which parameter has to be returned
  2783.             switch(type) {
  2784.                 case TD_SHININESS :
  2785.                     (*value)=surf->shininess;
  2786.  
  2787.                     break;
  2788.                 case TD_TRANSPARENCY :
  2789.                     (*value)=surf->transparency;
  2790.  
  2791.                     break;
  2792.                 default :
  2793.                     return(ER_NOTYPE);
  2794.             }
  2795.             break;
  2796.  
  2797.         case TD_TEXTURE :
  2798.             tex=(TDtexture *)mat->handle;
  2799.  
  2800.             break;
  2801.     }
  2802.  
  2803.     return(ER_NOERROR);
  2804. }
  2805.  
  2806. /****** td.library/tdCTMReset **********************************************
  2807. *   NAME    
  2808. *     tdCTMReset -- Resets the transformation matrix and
  2809. *                  the scale of the space.
  2810. *
  2811. *   SYNOPSIS
  2812. *    error = tdCTMReset( spacehandle )
  2813. *                        D1
  2814. *
  2815. *    TDerrors tdCTMReset
  2816. *         ( ULONG );
  2817. *
  2818. *   FUNCTION
  2819. *    The translation, rotation and scale factors will be set to
  2820. *    the default values.
  2821. *    Translation is 0, rotation is 0 and scale is 1, for all axis.
  2822. *
  2823. *   INPUTS
  2824. *     spacehandle   - A valid handle of a space.
  2825. *    
  2826. *   RESULT
  2827. *     error - ER_NOERROR   if all went well.
  2828. *            ER_NOSPACE   if the handle is not valid.
  2829. *   EXAMPLE
  2830. *    error = tdCTMReset(spacehandle);
  2831. *
  2832. *   NOTES
  2833. *
  2834. *   BUGS
  2835. *   SEE ALSO
  2836. *     tdTranslationChange(),tdTranslationGet()
  2837. *    tdRotationChange(),tdRotationGet()
  2838. *    tdScaleChange(),tdScaleGet()
  2839. ******************************************************************************
  2840. *
  2841. */
  2842. TDerrors __saveds ASM tdCTMReset(register __d1 ULONG spacehandle) {
  2843.     TDspace    *space=NULL;
  2844.       
  2845.     space=(TDspace *) spacehandle;
  2846.     if (space==NULL) return(ER_NOSPACE);
  2847.  
  2848.     space->ctm.sx=1,space->ctm.sy=1,space->ctm.sz=1;
  2849.     space->ctm.rx=0,space->ctm.ry=0,space->ctm.rz=0;
  2850.     space->ctm.m[0][0]=1,space->ctm.m[1][0]=0,space->ctm.m[2][0]=0,space->ctm.m[3][0]=0;
  2851.     space->ctm.m[0][1]=0,space->ctm.m[1][1]=1,space->ctm.m[2][1]=0,space->ctm.m[3][1]=0;
  2852.     space->ctm.m[0][2]=0,space->ctm.m[1][2]=0,space->ctm.m[2][2]=1,space->ctm.m[3][2]=0;
  2853.     space->ctm.m[0][3]=0,space->ctm.m[1][3]=0,space->ctm.m[2][3]=0,space->ctm.m[3][3]=1;
  2854.     
  2855.     return(ER_NOERROR);
  2856. }
  2857.  
  2858. /****** td.library/tdCTMChangedv ****************************************
  2859. *   NAME    
  2860. *     tdCTMChangedv -- Changes a parameter of the CTM of the space.
  2861. *
  2862. *   SYNOPSIS
  2863. *    error = tdCTMChangedv( spacehandle,type,vector,operation )
  2864. *                           D1          D2    A0    D3
  2865. *
  2866. *    TDerrors tdCTMChangedv
  2867. *         ( ULONG,TDenum,TDvectord *,TDenum );
  2868. *
  2869. *   FUNCTION
  2870. *    A parameter of the CTM will be modified in function of the vector
  2871. *    and the operation to perform.
  2872. *   INPUTS
  2873. *     spacehandle  - A valid handle of a space.
  2874. *    type         - Type of the parameter to change.
  2875. *    vector       - Pointer to a vector structure which contains
  2876. *                   the coordinates..
  2877. *    operation    - A valid CTM operation.
  2878. *
  2879. *   RESULT
  2880. *     error - ER_NOERROR       if all went well.
  2881. *            ER_NOSPACE       if the handle is not valid.
  2882. *            ER_NOTYPE        if the type is not valid.
  2883. *            ER_NOOPERATION   if the operation is not valid.
  2884. *   EXAMPLE
  2885. *    error = tdCTMChangedv(spacehandle,TD_TRANSLATION,&myvector,myoperation);
  2886. *
  2887. *   NOTES
  2888. *    If you pass 0 values for a division operation,
  2889. *    the corresponding CTM entry will be set to 0.
  2890. *
  2891. *   BUGS
  2892. *   SEE ALSO
  2893. *     tdCTMReset(),tdCTMGet()
  2894. ******************************************************************************
  2895. *
  2896. */
  2897. TDerrors __saveds ASM tdCTMChangedv(register __d1 ULONG spacehandle,
  2898.                                     register __d2 TDenum type,
  2899.                                     register __a0 TDvectord *vector,
  2900.                                     register __d3 TDenum operation) {
  2901.                                 
  2902.     TDspace    *space=NULL;
  2903.     TDvectord    *tvector=NULL;
  2904.       
  2905.     // make a copy of vector, a0 is a scratch register
  2906.     tvector=vector;
  2907.     
  2908.     space=(TDspace *) spacehandle;
  2909.     if (space==NULL) return(ER_NOSPACE);
  2910.  
  2911.     // change the parameter
  2912.     switch(type) {
  2913.         case TD_TRANSLATION :
  2914.             if(translationChange(space,(*tvector),operation)) return(ER_NOOPERATION);
  2915.             break;
  2916.         case TD_ROTATION :
  2917.             if(rotationChange(space,(*tvector),operation)) return(ER_NOOPERATION);
  2918.             break;
  2919.         case TD_SCALE :
  2920.             if(scaleChange(space,(*tvector),operation)) return(ER_NOOPERATION);
  2921.             break;
  2922.         default :
  2923.             return(ER_NOTYPE);
  2924.     }
  2925.  
  2926.     return(ER_NOERROR);
  2927. }
  2928.  
  2929. /****** td.library/tdCTMChangefv ****************************************
  2930. *   NAME    
  2931. *     tdCTMChangefv -- Changes a parameter of the CTM of the space.
  2932. *
  2933. *   SYNOPSIS
  2934. *    error = tdCTMChangefv( spacehandle,type,vector,operation )
  2935. *                           D1          D2    A0    D3
  2936. *
  2937. *    TDerrors tdCTMChangefv
  2938. *         ( ULONG,TDenum,TDvectorf *,TDenum );
  2939. *
  2940. *   FUNCTION
  2941. *    A parameter of the CTM will be modified in function of the vector
  2942. *    and the operation to perform.
  2943. *   INPUTS
  2944. *     spacehandle  - A valid handle of a space.
  2945. *    type         - Type of the parameter to change.
  2946. *    vector       - Pointer to a vector structure which contains
  2947. *                   the coordinates..
  2948. *    operation    - A valid CTM operation.
  2949. *
  2950. *   RESULT
  2951. *     error - ER_NOERROR       if all went well.
  2952. *            ER_NOSPACE       if the handle is not valid.
  2953. *            ER_NOTYPE        if the type is not valid.
  2954. *            ER_NOOPERATION   if the operation is not valid.
  2955. *   EXAMPLE
  2956. *    error = tdCTMChangedv(spacehandle,TD_TRANSLATION,&myvector,myoperation);
  2957. *
  2958. *   NOTES
  2959. *    If you pass 0 values for a division operation,
  2960. *    the corresponding CTM entry will be set to 0.
  2961. *
  2962. *   BUGS
  2963. *   SEE ALSO
  2964. *     tdCTMReset(),tdCTMGet()
  2965. ******************************************************************************
  2966. *
  2967. */
  2968. TDerrors __saveds ASM tdCTMChangefv(register __d1 ULONG spacehandle,
  2969.                                     register __d2 TDenum type,
  2970.                                     register __a0 TDvectorf *vector,
  2971.                                     register __d3 TDenum operation) {
  2972.                                 
  2973.     TDspace    *space=NULL;
  2974.     TDvectord    tvector;
  2975.       
  2976.     // make a copy of vector, a0 is a scratch register
  2977.     tvector.x=vector->x;
  2978.     tvector.y=vector->y;
  2979.     tvector.z=vector->z;
  2980.     
  2981.     space=(TDspace *) spacehandle;
  2982.     if (space==NULL) return(ER_NOSPACE);
  2983.  
  2984.     // change the parameter
  2985.     switch(type) {
  2986.         case TD_TRANSLATION :
  2987.             if(translationChange(space,tvector,operation)) return(ER_NOOPERATION);
  2988.             break;
  2989.         case TD_ROTATION :
  2990.             if(rotationChange(space,tvector,operation)) return(ER_NOOPERATION);
  2991.             break;
  2992.         case TD_SCALE :
  2993.             if(scaleChange(space,tvector,operation)) return(ER_NOOPERATION);
  2994.             break;
  2995.         default :
  2996.             return(ER_NOTYPE);
  2997.     }
  2998.  
  2999.     return(ER_NOERROR);
  3000. }
  3001.  
  3002. /****** td.library/tdCTMChange3da ****************************************
  3003. *   NAME    
  3004. *     tdCTMChange3da -- Changes a parameter of the CTM of the space.
  3005. *
  3006. *   SYNOPSIS
  3007. *    error = tdCTMChange3da( spacehandle,type,array,operation )
  3008. *                            D1          D2    A0    D3
  3009. *
  3010. *    TDerrors tdCTMChange3da
  3011. *         ( ULONG,TDenum,TDdouble [3],TDenum );
  3012. *
  3013. *   FUNCTION
  3014. *    A parameter of the CTM will be modified in function of the vector
  3015. *    and the operation to perform.
  3016. *   INPUTS
  3017. *     spacehandle  - A valid handle of a space.
  3018. *    type         - Type of the parameter to change.
  3019. *    array        - Array which contains the coordinates..
  3020. *    operation    - A valid CTM operation.
  3021. *
  3022. *   RESULT
  3023. *     error - ER_NOERROR       if all went well.
  3024. *            ER_NOSPACE       if the handle is not valid.
  3025. *            ER_NOTYPE        if the type is not valid.
  3026. *            ER_NOOPERATION   if the operation is not valid.
  3027. *   EXAMPLE
  3028. *    error = tdCTMChange3da(spacehandle,TD_TRANSLATION,myarray,myoperation);
  3029. *
  3030. *   NOTES
  3031. *    If you pass 0 values for a division operation,
  3032. *    the corresponding CTM entry will be set to 0.
  3033. *
  3034. *   BUGS
  3035. *   SEE ALSO
  3036. *     tdCTMReset(),tdCTMGet()
  3037. ******************************************************************************
  3038. *
  3039. */
  3040. TDerrors __saveds ASM tdCTMChange3da(register __d1 ULONG spacehandle,
  3041.                                     register __d2 TDenum type,
  3042.                                     register __a0 TDdouble array[3],
  3043.                                     register __d3 TDenum operation) {
  3044.                                 
  3045.     TDspace    *space=NULL;
  3046.     TDvectord    tvector;
  3047.       
  3048.     // make a copy of vector, a0 is a scratch register
  3049.     tvector.x=array[0];
  3050.     tvector.y=array[1];
  3051.     tvector.z=array[2];
  3052.     
  3053.     space=(TDspace *) spacehandle;
  3054.     if (space==NULL) return(ER_NOSPACE);
  3055.  
  3056.     // change the parameter
  3057.     switch(type) {
  3058.         case TD_TRANSLATION :
  3059.             if(translationChange(space,tvector,operation)) return(ER_NOOPERATION);
  3060.             break;
  3061.         case TD_ROTATION :
  3062.             if(rotationChange(space,tvector,operation)) return(ER_NOOPERATION);
  3063.             break;
  3064.         case TD_SCALE :
  3065.             if(scaleChange(space,tvector,operation)) return(ER_NOOPERATION);
  3066.             break;
  3067.         default :
  3068.             return(ER_NOTYPE);
  3069.     }
  3070.  
  3071.     return(ER_NOERROR);
  3072. }
  3073.  
  3074. /****** td.library/tdCTMChange3fa ****************************************
  3075. *   NAME    
  3076. *     tdCTMChange3fa -- Changes a parameter of the CTM of the space.
  3077. *
  3078. *   SYNOPSIS
  3079. *    error = tdCTMChange3fa( spacehandle,type,array,operation )
  3080. *                            D1          D2    A0    D3
  3081. *
  3082. *    TDerrors tdCTMChange3fa
  3083. *         ( ULONG,TDenum,TDfloat [3],TDenum );
  3084. *
  3085. *   FUNCTION
  3086. *    A parameter of the CTM will be modified in function of the vector
  3087. *    and the operation to perform.
  3088. *   INPUTS
  3089. *     spacehandle  - A valid handle of a space.
  3090. *    type         - Type of the parameter to change.
  3091. *    array        - Array which contains the coordinates..
  3092. *    operation    - A valid CTM operation.
  3093. *
  3094. *   RESULT
  3095. *     error - ER_NOERROR       if all went well.
  3096. *            ER_NOSPACE       if the handle is not valid.
  3097. *            ER_NOTYPE        if the type is not valid.
  3098. *            ER_NOOPERATION   if the operation is not valid.
  3099. *   EXAMPLE
  3100. *    error = tdCTMChange3fa(spacehandle,TD_TRANSLATION,myarray,myoperation);
  3101. *
  3102. *   NOTES
  3103. *    If you pass 0 values for a division operation,
  3104. *    the corresponding CTM entry will be set to 0.
  3105. *
  3106. *   BUGS
  3107. *   SEE ALSO
  3108. *     tdCTMReset(),tdCTMGet()
  3109. ******************************************************************************
  3110. *
  3111. */
  3112. TDerrors __saveds ASM tdCTMChange3fa(register __d1 ULONG spacehandle,
  3113.                                     register __d2 TDenum type,
  3114.                                     register __a0 TDfloat array[3],
  3115.                                     register __d3 TDenum operation) {
  3116.                                 
  3117.     TDspace    *space=NULL;
  3118.     TDvectord    tvector;
  3119.       
  3120.     // make a copy of vector, a0 is a scratch register
  3121.     tvector.x=array[0];
  3122.     tvector.y=array[1];
  3123.     tvector.z=array[2];
  3124.     
  3125.     space=(TDspace *) spacehandle;
  3126.     if (space==NULL) return(ER_NOSPACE);
  3127.  
  3128.     // change the parameter
  3129.     switch(type) {
  3130.         case TD_TRANSLATION :
  3131.             if(translationChange(space,tvector,operation)) return(ER_NOOPERATION);
  3132.             break;
  3133.         case TD_ROTATION :
  3134.             if(rotationChange(space,tvector,operation)) return(ER_NOOPERATION);
  3135.             break;
  3136.         case TD_SCALE :
  3137.             if(scaleChange(space,tvector,operation)) return(ER_NOOPERATION);
  3138.             break;
  3139.         default :
  3140.             return(ER_NOTYPE);
  3141.     }
  3142.  
  3143.     return(ER_NOERROR);
  3144. }
  3145.  
  3146. /****** td.library/tdCTMGetdv ******************************************
  3147. *   NAME    
  3148. *     tdCTMGetdv -- Get a parameter of the space its CTM.
  3149. *
  3150. *   SYNOPSIS
  3151. *    error = tdCTMGetdv( spacehandle,type,vector )
  3152. *                        D1          D2    A0
  3153. *
  3154. *    TDerrors tdCTMGetdv
  3155. *         ( ULONG,TDenum,TDvectord * );
  3156. *
  3157. *   FUNCTION
  3158. *    A parameter of the CTM will be returned in the passed
  3159. *    vector structure.
  3160. *   INPUTS
  3161. *     spacehandle  - A valid handle of a space.
  3162. *    type         - The type of the parameter to return.
  3163. *    vector       - Pointer to a vertex structure which will
  3164. *                   contain the values.
  3165. *
  3166. *   RESULT
  3167. *     error - ER_NOERROR  if all went well.
  3168. *            ER_NOSPACE  if the handle is not valid.
  3169. *   EXAMPLE
  3170. *    error = tdCTMGetdv(spacehandle,TD_ROTATION,&myvector);
  3171. *
  3172. *   NOTES
  3173. *
  3174. *   BUGS
  3175. *   SEE ALSO
  3176. *     tdCTMReset(),tdCTMChange()
  3177. ******************************************************************************
  3178. *
  3179. */
  3180. TDerrors __saveds ASM tdCTMGetdv(register __d1 ULONG spacehandle,
  3181.                                 register __d2 TDenum type,
  3182.                                 register __a0 TDvectord *vector) {
  3183.                                 
  3184.     TDspace    *space=NULL;
  3185.     TDvectord    *tvector=NULL;
  3186.       
  3187.     // make a copy of translation vertex, a0 is a scratch register
  3188.     tvector=vector;
  3189.     
  3190.     space=(TDspace *) spacehandle;
  3191.     if (space==NULL) return(ER_NOSPACE);
  3192.  
  3193.     switch(type) {
  3194.         case TD_TRANSLATION :
  3195.             tvector->x=space->ctm.m[3][0];
  3196.             tvector->y=space->ctm.m[3][1];
  3197.             tvector->z=space->ctm.m[3][2];
  3198.             break;
  3199.         case TD_SCALE :
  3200.             tvector->x=space->ctm.sx;
  3201.             tvector->y=space->ctm.sy;
  3202.             tvector->z=space->ctm.sz;
  3203.             break;
  3204.         case TD_ROTATION :
  3205.             tvector->x=space->ctm.rx;
  3206.             tvector->y=space->ctm.ry;
  3207.             tvector->z=space->ctm.rz;
  3208.         default :
  3209.             return(ER_NOTYPE);
  3210.     }
  3211.  
  3212.     return(ER_NOERROR);
  3213. }
  3214.  
  3215. /****** td.library/tdCTMGetfv ******************************************
  3216. *   NAME    
  3217. *     tdCTMGetfv -- Get a parameter of the space its CTM.
  3218. *
  3219. *   SYNOPSIS
  3220. *    error = tdCTMGetfv( spacehandle,type,vector )
  3221. *                        D1          D2    A0
  3222. *
  3223. *    TDerrors tdCTMGetfv
  3224. *         ( ULONG,TDenum,TDvectorf * );
  3225. *
  3226. *   FUNCTION
  3227. *    A parameter of the CTM will be returned in the passed
  3228. *    vector structure.
  3229. *   INPUTS
  3230. *     spacehandle  - A valid handle of a space.
  3231. *    type         - The type of the parameter to return.
  3232. *    vector       - Pointer to a vertex structure which will
  3233. *                   contain the values.
  3234. *
  3235. *   RESULT
  3236. *     error - ER_NOERROR  if all went well.
  3237. *            ER_NOSPACE  if the handle is not valid.
  3238. *   EXAMPLE
  3239. *    error = tdCTMGetfv(spacehandle,TD_ROTATION,&myvector);
  3240. *
  3241. *   NOTES
  3242. *
  3243. *   BUGS
  3244. *   SEE ALSO
  3245. *     tdCTMReset(),tdCTMChange()
  3246. ******************************************************************************
  3247. *
  3248. */
  3249. TDerrors __saveds ASM tdCTMGetfv(register __d1 ULONG spacehandle,
  3250.                                 register __d2 TDenum type,
  3251.                                 register __a0 TDvectorf *vector) {
  3252.                                 
  3253.     TDspace    *space=NULL;
  3254.     TDvectorf    *tvector=NULL;
  3255.       
  3256.     // make a copy of translation vertex, a0 is a scratch register
  3257.     tvector=vector;
  3258.     
  3259.     space=(TDspace *) spacehandle;
  3260.     if (space==NULL) return(ER_NOSPACE);
  3261.  
  3262.     switch(type) {
  3263.         case TD_TRANSLATION :
  3264.             tvector->x=space->ctm.m[3][0];
  3265.             tvector->y=space->ctm.m[3][1];
  3266.             tvector->z=space->ctm.m[3][2];
  3267.             break;
  3268.         case TD_SCALE :
  3269.             tvector->x=space->ctm.sx;
  3270.             tvector->y=space->ctm.sy;
  3271.             tvector->z=space->ctm.sz;
  3272.             break;
  3273.         case TD_ROTATION :
  3274.             tvector->x=space->ctm.rx;
  3275.             tvector->y=space->ctm.ry;
  3276.             tvector->z=space->ctm.rz;
  3277.         default :
  3278.             return(ER_NOTYPE);
  3279.     }
  3280.  
  3281.     return(ER_NOERROR);
  3282. }
  3283.  
  3284. /****** td.library/tdCTMGet3da ******************************************
  3285. *   NAME    
  3286. *     tdCTMGet3da -- Get a parameter of the space its CTM.
  3287. *
  3288. *   SYNOPSIS
  3289. *    error = tdCTMGet3da( spacehandle,type,array )
  3290. *                        D1          D2     A0
  3291. *
  3292. *    TDerrors tdCTMGet3da
  3293. *         ( ULONG,TDenum,TDdouble [3] );
  3294. *
  3295. *   FUNCTION
  3296. *    A parameter of the CTM will be returned in the passed
  3297. *    vector structure.
  3298. *   INPUTS
  3299. *     spacehandle  - A valid handle of a space.
  3300. *    type         - The type of the parameter to return.
  3301. *    array        - Array which will contain the values.
  3302. *
  3303. *   RESULT
  3304. *     error - ER_NOERROR  if all went well.
  3305. *            ER_NOSPACE  if the handle is not valid.
  3306. *   EXAMPLE
  3307. *    error = tdCTMGet3da(spacehandle,TD_ROTATION,myarray);
  3308. *
  3309. *   NOTES
  3310. *
  3311. *   BUGS
  3312. *   SEE ALSO
  3313. *     tdCTMReset(),tdCTMChange()
  3314. ******************************************************************************
  3315. *
  3316. */
  3317. TDerrors __saveds ASM tdCTMGet3da(register __d1 ULONG spacehandle,
  3318.                                 register __d2 TDenum type,
  3319.                                 register __a0 TDdouble array[3]) {
  3320.                                 
  3321.     TDspace    *space=NULL;
  3322.     TDdouble    *marray=NULL;
  3323.       
  3324.     // make a copy of translation vertex, a0 is a scratch register
  3325.     marray=array;
  3326.     
  3327.     space=(TDspace *) spacehandle;
  3328.     if (space==NULL) return(ER_NOSPACE);
  3329.  
  3330.     switch(type) {
  3331.         case TD_TRANSLATION :
  3332.             marray[0]=space->ctm.m[3][0];
  3333.             marray[1]=space->ctm.m[3][1];
  3334.             marray[2]=space->ctm.m[3][2];
  3335.             break;
  3336.         case TD_SCALE :
  3337.             marray[0]=space->ctm.sx;
  3338.             marray[1]=space->ctm.sy;
  3339.             marray[2]=space->ctm.sz;
  3340.             break;
  3341.         case TD_ROTATION :
  3342.             marray[0]=space->ctm.rx;
  3343.             marray[1]=space->ctm.ry;
  3344.             marray[2]=space->ctm.rz;
  3345.         default :
  3346.             return(ER_NOTYPE);
  3347.     }
  3348.  
  3349.     return(ER_NOERROR);
  3350. }
  3351.  
  3352. /****** td.library/tdCTMGet3fa ******************************************
  3353. *   NAME    
  3354. *     tdCTMGet3fa -- Get a parameter of the space its CTM.
  3355. *
  3356. *   SYNOPSIS
  3357. *    error = tdCTMGet3fa( spacehandle,type,array )
  3358. *                        D1          D2     A0
  3359. *
  3360. *    TDerrors tdCTMGet3fa
  3361. *         ( ULONG,TDenum,TDfloat [3] );
  3362. *
  3363. *   FUNCTION
  3364. *    A parameter of the CTM will be returned in the passed
  3365. *    vector structure.
  3366. *   INPUTS
  3367. *     spacehandle  - A valid handle of a space.
  3368. *    type         - The type of the parameter to return.
  3369. *    array        - Array which will contain the values.
  3370. *
  3371. *   RESULT
  3372. *     error - ER_NOERROR  if all went well.
  3373. *            ER_NOSPACE  if the handle is not valid.
  3374. *   EXAMPLE
  3375. *    error = tdCTMGet3fa(spacehandle,TD_ROTATION,myarray);
  3376. *
  3377. *   NOTES
  3378. *
  3379. *   BUGS
  3380. *   SEE ALSO
  3381. *     tdCTMReset(),tdCTMChange()
  3382. ******************************************************************************
  3383. *
  3384. */
  3385. TDerrors __saveds ASM tdCTMGet3fa(register __d1 ULONG spacehandle,
  3386.                                 register __d2 TDenum type,
  3387.                                 register __a0 TDfloat array[3]) {
  3388.                                 
  3389.     TDspace    *space=NULL;
  3390.     TDfloat    *marray=NULL;
  3391.       
  3392.     // make a copy of translation vertex, a0 is a scratch register
  3393.     marray=array;
  3394.     
  3395.     space=(TDspace *) spacehandle;
  3396.     if (space==NULL) return(ER_NOSPACE);
  3397.  
  3398.     switch(type) {
  3399.         case TD_TRANSLATION :
  3400.             marray[0]=space->ctm.m[3][0];
  3401.             marray[1]=space->ctm.m[3][1];
  3402.             marray[2]=space->ctm.m[3][2];
  3403.             break;
  3404.         case TD_SCALE :
  3405.             marray[0]=space->ctm.sx;
  3406.             marray[1]=space->ctm.sy;
  3407.             marray[2]=space->ctm.sz;
  3408.             break;
  3409.         case TD_ROTATION :
  3410.             marray[0]=space->ctm.rx;
  3411.             marray[1]=space->ctm.ry;
  3412.             marray[2]=space->ctm.rz;
  3413.         default :
  3414.             return(ER_NOTYPE);
  3415.     }
  3416.  
  3417.     return(ER_NOERROR);
  3418. }
  3419.  
  3420. /****** td.library/tdObjectSetfa ******************************************
  3421. *   NAME    
  3422. *     tdObjectSetfa -- Set a parameter of the an object.
  3423. *   SYNOPSIS
  3424. *    error = tdObjectSetfa( spacehandle,type,index,array )
  3425. *                           D1          D2   D3     A0
  3426. *
  3427. *    TDerrors tdObjectSetfa
  3428. *         ( ULONG,TDenum,ULONG,TDfloat * );
  3429. *
  3430. *   FUNCTION
  3431. *    The parameter of the object at index, will be changed.
  3432. *    Type specifies which parameter. The array its size is dependend
  3433. *    of the type.
  3434. *   INPUTS
  3435. *     spacehandle     - A valid handle of a space.
  3436. *    type            - The parameter its type.
  3437. *    index           - The parameter its index.
  3438. *    array           - Array which contains the values.
  3439. *    
  3440. *   RESULT
  3441. *     error - ER_NOERROR  if all went well.
  3442. *            ER_NOSPACE  if the handle is not valid.
  3443. *            ER_NOTYPE   if the type is not valid.
  3444. *            ER_NOINDEX  if the index is not valid.
  3445. *
  3446. *   EXAMPLE
  3447. *    error = tdObjectSetfa(spacehandle,TD_CUBE,7,size);
  3448. *
  3449. *   NOTES
  3450. *    If a value is out of range it will be set to its possible
  3451. *    maximum or minimum.
  3452. *
  3453. *   BUGS
  3454. *   SEE ALSO
  3455. *     tdObjectGet()
  3456. ******************************************************************************
  3457. *
  3458. */
  3459. TDerrors __saveds ASM tdObjectSetfa(register __d1 ULONG spacehandle,
  3460.                                     register __d2 TDenum type,
  3461.                                     register __d3 ULONG index,
  3462.                                     register __a0 TDfloat *array) {
  3463.     TDspace        *space=NULL;
  3464.     TDobjectnode    *object=NULL;
  3465.     TDcube            *cube=NULL;
  3466.     TDfloat        *marray=NULL;
  3467.  
  3468.     // make a copy of the array, because a0 is a scratch register
  3469.     marray = array;
  3470.  
  3471.     space=(TDspace *) spacehandle;
  3472.     if (space==NULL) return(ER_NOSPACE);
  3473.  
  3474.     object=getObjectNode(space,index);
  3475.     if(object==NULL) return(ER_NOINDEX);
  3476.  
  3477.     // check which parameter has to be changed
  3478.     switch(type) {
  3479.         case TD_ORIGIN :
  3480.             object->o.x=marray[0];
  3481.             object->o.y=marray[1];
  3482.             object->o.z=marray[2];
  3483.             
  3484.             break;
  3485.         case TD_ROTATION :
  3486.             object->r.x=marray[0];
  3487.             object->r.y=marray[1];
  3488.             object->r.z=marray[2];
  3489.             
  3490.             break;
  3491.         case TD_SCALE :
  3492.             object->s.x=marray[0];
  3493.             object->s.y=marray[1];
  3494.             object->s.z=marray[2];
  3495.             
  3496.             break;
  3497.         case TD_CUBE :
  3498.             if(object->type!=TD_CUBE) {
  3499.                 return(ER_NOTYPE);
  3500.             }
  3501.             cube=(TDcube *)object->handle;
  3502.             
  3503.             cube->size.x=marray[0];
  3504.             cube->size.y=marray[1];
  3505.             cube->size.z=marray[2];
  3506.  
  3507.             break;
  3508.         default :
  3509.             return(ER_NOTYPE);
  3510.     }
  3511.  
  3512.     return(ER_NOERROR);
  3513. }
  3514.  
  3515. /****** td.library/tdObjectGetfa ******************************************
  3516. *   NAME    
  3517. *     tdObjectGetfa -- Get a parameter of the a object.
  3518. *   SYNOPSIS
  3519. *    error = tdObjectGetfa( spacehandle,type,index,array )
  3520. *                           D1          D2   D3     A0
  3521. *
  3522. *    TDerrors tdObjectGetfa
  3523. *         ( ULONG,TDenum,ULONG,TDfloat * );
  3524. *
  3525. *   FUNCTION
  3526. *    The parameter of the object at index, will be returned.
  3527. *    Type specifies which parameter. The array its size is dependend
  3528. *    of the type.
  3529. *   INPUTS
  3530. *     spacehandle     - A valid handle of a space.
  3531. *    type            - The parameter its type.
  3532. *    index           - The parameter its index.
  3533. *    array           - Pointer to a correct sized array, which
  3534. *                      will contain the values.
  3535. *    
  3536. *   RESULT
  3537. *     error - ER_NOERROR  if all went well.
  3538. *            ER_NOSPACE  if the handle is not valid.
  3539. *            ER_NOTYPE   if the type is not valid.
  3540. *            ER_NOINDEX  if the index is not valid.
  3541. *
  3542. *   EXAMPLE
  3543. *    error = tdObjectGetfa(spacehandle,TD_ORIGIN,12,array);
  3544. *
  3545. *   NOTES
  3546. *
  3547. *   BUGS
  3548. *   SEE ALSO
  3549. *     tdObjectSet()
  3550. ******************************************************************************
  3551. *
  3552. */
  3553. TDerrors __saveds ASM tdObjectGetfa(register __d1 ULONG spacehandle,
  3554.                                     register __d2 TDenum type,
  3555.                                     register __d3 ULONG index,
  3556.                                     register __a0 TDfloat *array) {
  3557.     TDspace        *space=NULL;
  3558.     TDobjectnode    *object=NULL;
  3559.     TDcube            *cube=NULL;
  3560.     TDfloat        *marray=NULL;
  3561.  
  3562.     // make a copy of the array, because a0 is a scratch register
  3563.     marray = array;
  3564.  
  3565.     space=(TDspace *) spacehandle;
  3566.     if (space==NULL) return(ER_NOSPACE);
  3567.  
  3568.     object=getObjectNode(space,index);
  3569.     if(object==NULL) return(ER_NOINDEX);
  3570.  
  3571.     // check which parameter has to be returned
  3572.     switch(type) {
  3573.         case TD_ORIGIN :
  3574.             marray[0]=object->o.x;
  3575.             marray[1]=object->o.y;
  3576.             marray[2]=object->o.z;
  3577.             
  3578.             break;
  3579.         case TD_ROTATION :
  3580.             marray[0]=object->r.x;
  3581.             marray[1]=object->r.y;
  3582.             marray[2]=object->r.z;
  3583.             
  3584.             break;
  3585.         case TD_SCALE :
  3586.             marray[0]=object->s.x;
  3587.             marray[1]=object->s.y;
  3588.             marray[2]=object->s.z;
  3589.             
  3590.             break;
  3591.         case TD_CUBE :
  3592.             if(object->type!=TD_CUBE) {
  3593.                 return(ER_NOTYPE);
  3594.             }
  3595.  
  3596.             cube=(TDcube *)object->handle;
  3597.  
  3598.             marray[0]=cube->size.x;
  3599.             marray[1]=cube->size.y;
  3600.             marray[2]=cube->size.z;
  3601.  
  3602.             break;
  3603.         default :
  3604.             return(ER_NOTYPE);
  3605.     }
  3606.  
  3607.     return(ER_NOERROR);
  3608. }
  3609.  
  3610. /****** td.library/tdObjectSetda ******************************************
  3611. *   NAME    
  3612. *     tdObjectSetda -- Set a parameter of the a object.
  3613. *   SYNOPSIS
  3614. *    error = tdObjectSetda( spacehandle,type,index,array )
  3615. *                           D1          D2   D3     A0
  3616. *
  3617. *    TDerrors tdObjectSetfa
  3618. *         ( ULONG,TDenum,ULONG,TDdouble * );
  3619. *
  3620. *   FUNCTION
  3621. *    The parameter of the object at index, will be changed.
  3622. *    Type specifies which parameter. The array its size is dependend
  3623. *    of the type.
  3624. *   INPUTS
  3625. *     spacehandle     - A valid handle of a space.
  3626. *    type            - The parameter its type.
  3627. *    index           - The parameter its index.
  3628. *    array           - Array which contains the values.
  3629. *    
  3630. *   RESULT
  3631. *     error - ER_NOERROR  if all went well.
  3632. *            ER_NOSPACE  if the handle is not valid.
  3633. *            ER_NOTYPE   if the type is not valid.
  3634. *            ER_NOINDEX  if the index is not valid.
  3635. *
  3636. *   EXAMPLE
  3637. *    error = tdObjectSetda(spacehandle,TD_ORIGIN,2,origin);
  3638. *
  3639. *   NOTES
  3640. *
  3641. *   BUGS
  3642. *   SEE ALSO
  3643. *     tdObjectGet()
  3644. ******************************************************************************
  3645. *
  3646. */
  3647. TDerrors __saveds ASM tdObjectSetda(register __d1 ULONG spacehandle,
  3648.                                     register __d2 TDenum type,
  3649.                                     register __d3 ULONG index,
  3650.                                     register __a0 TDdouble *array) {
  3651.     TDspace        *space=NULL;
  3652.     TDobjectnode    *object=NULL;
  3653.     TDcube            *cube=NULL;
  3654.     TDdouble        *marray=NULL;
  3655.  
  3656.     // make a copy of the array, because a0 is a scratch register
  3657.     marray = array;
  3658.  
  3659.     space=(TDspace *) spacehandle;
  3660.     if (space==NULL) return(ER_NOSPACE);
  3661.  
  3662.     object=getObjectNode(space,index);
  3663.     if(object==NULL) return(ER_NOINDEX);
  3664.  
  3665.     // check which parameter has to be changed
  3666.     switch(type) {
  3667.         case TD_ORIGIN :
  3668.             object->o.x=marray[0];
  3669.             object->o.y=marray[1];
  3670.             object->o.z=marray[2];
  3671.             
  3672.             break;
  3673.         case TD_ROTATION :
  3674.             object->r.x=marray[0];
  3675.             object->r.y=marray[1];
  3676.             object->r.z=marray[2];
  3677.             
  3678.             break;
  3679.         case TD_SCALE :
  3680.             object->s.x=marray[0];
  3681.             object->s.y=marray[1];
  3682.             object->s.z=marray[2];
  3683.             
  3684.             break;
  3685.         case TD_CUBE :
  3686.             if(object->type!=TD_CUBE) {
  3687.                 return(ER_NOTYPE);
  3688.             }
  3689.             cube=(TDcube *)object->handle;
  3690.             
  3691.             cube->size.x=marray[0];
  3692.             cube->size.y=marray[1];
  3693.             cube->size.z=marray[2];
  3694.  
  3695.             break;
  3696.         default :
  3697.             return(ER_NOTYPE);
  3698.     }
  3699.  
  3700.     return(ER_NOERROR);
  3701. }
  3702.  
  3703. /****** td.library/tdObjectGetda ******************************************
  3704. *   NAME    
  3705. *     tdObjectGetda -- Get a parameter of the a object.
  3706. *   SYNOPSIS
  3707. *    error = tdObjectGetda( spacehandle,type,index,array )
  3708. *                           D1          D2   D3     A0
  3709. *
  3710. *    TDerrors tdObjectGetfa
  3711. *         ( ULONG,TDenum,ULONG,TDdouble * );
  3712. *
  3713. *   FUNCTION
  3714. *    The parameter of the object at index, will be returned.
  3715. *    Type specifies which parameter. The array its size is dependend
  3716. *    of the type.
  3717. *   INPUTS
  3718. *     spacehandle     - A valid handle of a space.
  3719. *    type            - The parameter its type.
  3720. *    index           - The parameter its index.
  3721. *    array           - Pointer to a correct sized array, which
  3722. *                      will contain the values.
  3723. *    
  3724. *   RESULT
  3725. *     error - ER_NOERROR  if all went well.
  3726. *            ER_NOSPACE  if the handle is not valid.
  3727. *            ER_NOTYPE   if the type is not valid.
  3728. *            ER_NOINDEX  if the index is not valid.
  3729. *
  3730. *   EXAMPLE
  3731. *    error = tdObjectGetda(spacehandle,TD_SCALE,3,array);
  3732. *
  3733. *   NOTES
  3734. *    If a value is out of range it will be set to its possible
  3735. *    maximum or minimum.
  3736. *
  3737. *   BUGS
  3738. *   SEE ALSO
  3739. *     tdObjectSet()
  3740. ******************************************************************************
  3741. *
  3742. */
  3743. TDerrors __saveds ASM tdObjectGetda(register __d1 ULONG spacehandle,
  3744.                                     register __d2 TDenum type,
  3745.                                     register __d3 ULONG index,
  3746.                                     register __a0 TDdouble *array) {
  3747.     TDspace        *space=NULL;
  3748.     TDobjectnode    *object=NULL;
  3749.     TDcube            *cube=NULL;
  3750.     TDdouble        *marray=NULL;
  3751.  
  3752.     // make a copy of the array, because a0 is a scratch register
  3753.     marray = array;
  3754.  
  3755.     space=(TDspace *) spacehandle;
  3756.     if (space==NULL) return(ER_NOSPACE);
  3757.  
  3758.     object=getObjectNode(space,index);
  3759.     if(object==NULL) return(ER_NOINDEX);
  3760.  
  3761.     // check which parameter has to be returned
  3762.     switch(type) {
  3763.         case TD_ORIGIN :
  3764.             marray[0]=object->o.x;
  3765.             marray[1]=object->o.y;
  3766.             marray[2]=object->o.z;
  3767.             
  3768.             break;
  3769.         case TD_ROTATION :
  3770.             marray[0]=object->r.x;
  3771.             marray[1]=object->r.y;
  3772.             marray[2]=object->r.z;
  3773.  
  3774.             break;
  3775.         case TD_SCALE :
  3776.             marray[0]=object->s.x;
  3777.             marray[1]=object->s.y;
  3778.             marray[2]=object->s.z;
  3779.             
  3780.             break;
  3781.         case TD_CUBE :
  3782.             if(object->type!=TD_CUBE) {
  3783.                 return(ER_NOTYPE);
  3784.             }
  3785.  
  3786.             cube=(TDcube *)object->handle;
  3787.  
  3788.             marray[0]=cube->size.x;
  3789.             marray[1]=cube->size.y;
  3790.             marray[2]=cube->size.z;
  3791.  
  3792.             break;
  3793.         default :
  3794.             return(ER_NOTYPE);
  3795.     }
  3796.  
  3797.     return(ER_NOERROR);
  3798. }
  3799.  
  3800. /****** td.library/tdTypeGet ******************************************
  3801. *   NAME    
  3802. *     tdTypeGet -- Get the real type of a component in the space.
  3803. *   SYNOPSIS
  3804. *    error = tdGetType( spacehandle,type,index,rtype )
  3805. *                       D1          D2   D3    D4
  3806. *
  3807. *    TDerrors tdTypeGet
  3808. *         ( ULONG,TDenum,ULONG,TDenum * );
  3809. *
  3810. *   FUNCTION
  3811. *    The component of the space at index its real type will
  3812. *    be returned.
  3813. *    Type specifies which component.
  3814. *   INPUTS
  3815. *     spacehandle     - A valid handle of a space.
  3816. *    type            - The component its type.
  3817. *    index           - The parameter its index.
  3818. *    rtype           - Pointer to a variable, which
  3819. *                      will contain the real type.
  3820. *    
  3821. *   RESULT
  3822. *     error - ER_NOERROR  if all went well.
  3823. *            ER_NOSPACE  if the handle is not valid.
  3824. *            ER_NOTYPE   if the type is not valid.
  3825. *            ER_NOINDEX  if the index is not valid.
  3826. *
  3827. *   EXAMPLE
  3828. *    error = tdTypeGet(spacehandle,TD_OBJECT,45,type);
  3829. *
  3830. *   NOTES
  3831. *    For example : TD_OBJECT which is the parent type
  3832. *    and the real type is TD_CUBE.
  3833. *
  3834. *   BUGS
  3835. *   SEE ALSO
  3836. ******************************************************************************
  3837. *
  3838. */
  3839. TDerrors __saveds ASM tdTypeGet(register __d1 ULONG spacehandle,
  3840.                                 register __d2 TDenum type,
  3841.                                 register __d3 ULONG index,
  3842.                                 register __d4 TDenum *rtype) {
  3843.     TDspace        *space=NULL;
  3844.     TDobjectnode    *object=NULL;
  3845.     TDmaterialnode    *mat=NULL;
  3846.  
  3847.     space=(TDspace *) spacehandle;
  3848.     if (space==NULL) return(ER_NOSPACE);
  3849.  
  3850.     // search for the real type
  3851.     switch(type) {
  3852.         case TD_OBJECT :
  3853.             object=getObjectNode(space,index);
  3854.             if(object==NULL) return(ER_NOINDEX);
  3855.  
  3856.             (*rtype)=object->type;
  3857.  
  3858.             break;
  3859.         case TD_MATERIAL :
  3860.             mat=getMaterialNode(space,index);
  3861.             if(mat==NULL) return(ER_NOINDEX);
  3862.  
  3863.             (*rtype)=mat->type;
  3864.  
  3865.             break;
  3866.         default :
  3867.             return(ER_NOTYPE);
  3868.     }
  3869.  
  3870.     return(ER_NOERROR);
  3871. }
  3872.  
  3873. /****** td.library/tdCurrent ******************************************
  3874. *   NAME    
  3875. *     tdCurrent -- Set the component to work with.
  3876. *   SYNOPSIS
  3877. *    error = tdCurrent( spacehandle,type,index)
  3878. *                       D1          D2   D3
  3879. *
  3880. *    TDerrors tdCurrent
  3881. *         ( ULONG,TDenum,ULONG );
  3882. *
  3883. *   FUNCTION
  3884. *    The component of the space at index will be used for
  3885. *    further special operations.
  3886. *    Type specifies which component.
  3887. *   INPUTS
  3888. *     spacehandle     - A valid handle of a space.
  3889. *    type            - The component its type.
  3890. *    index           - The component its index.
  3891. *    
  3892. *   RESULT
  3893. *     error - ER_NOERROR     if all went well.
  3894. *            ER_NOSPACE     if the handle is not valid.
  3895. *            ER_NOOBJECT    if there is no current object.
  3896. *            ER_NOMATGROUP  if there is no current material group.
  3897. *            ER_NOTYPE      if the type is not valid.
  3898. *            ER_NOINDEX     if the index is not valid.
  3899. *
  3900. *   EXAMPLE
  3901. *    error = tdCurrent(spacehandle,TD_OBJECT,5);
  3902. *
  3903. *   NOTES
  3904. *
  3905. *   BUGS
  3906. *   SEE ALSO
  3907. *     tdBegin(),tdEnd()
  3908. ******************************************************************************
  3909. *
  3910. */
  3911. TDerrors __saveds ASM tdCurrent(register __d1 ULONG spacehandle,
  3912.                                 register __d2 TDenum type,
  3913.                                 register __d3 ULONG index ) {
  3914.     TDspace        *space=NULL;
  3915.     TDpolymesh        *polymesh=NULL;
  3916.     TDmatgroupnode    *matgroupn=NULL;
  3917.     TDpolygonnode    *polyn=NULL;
  3918.  
  3919.     space=(TDspace *) spacehandle;
  3920.     if (space==NULL) return(ER_NOSPACE);
  3921.  
  3922.     // set the current component according the type
  3923.     switch(type) {
  3924.         case TD_OBJECT :
  3925.             space->curobjn=getObjectNode(space,index);
  3926.             if(space->curobjn==NULL) return(ER_NOINDEX);
  3927.             
  3928.             switch(space->curobjn->type) {
  3929.                 case TD_POLYMESH :
  3930.                     polymesh=(TDpolymesh *)(space->curobjn->handle);
  3931.  
  3932.                     polymesh->curmatgroupn=NULL;
  3933.                     polymesh->curpolyn=NULL;
  3934.  
  3935.                     break;
  3936.             }
  3937.  
  3938.             break;
  3939.         case TD_MATERIAL :
  3940.             if(index<1 || index>space->materials.numberOfMaterials) return(ER_NOINDEX);
  3941.  
  3942.             space->curmatn=getMaterialNode(space,index);
  3943.             if(space->curmatn==NULL) return(ER_NOINDEX);
  3944.  
  3945.             break;
  3946.         case TD_MATGROUP :
  3947.             // check the parent
  3948.             if(space->curobjn==NULL) return(ER_NOOBJECT);
  3949.             if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  3950.  
  3951.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  3952.  
  3953.             // get the matgroup
  3954.             matgroupn=getMatGroupNode(polymesh,index);
  3955.             if(matgroupn==NULL) return(ER_NOINDEX);
  3956.  
  3957.             polymesh->curmatgroupn=matgroupn;
  3958.  
  3959.             break;
  3960.         case TD_POLYGON :
  3961.             // check the parent
  3962.             if(space->curobjn==NULL) return(ER_NOOBJECT);
  3963.             if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  3964.  
  3965.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  3966.  
  3967.             matgroupn=polymesh->curmatgroupn;
  3968.             
  3969.             if(matgroupn==NULL) return(ER_NOMATGROUP);
  3970.  
  3971.             polyn=getPolygonNode(matgroupn,index);
  3972.             if(polyn==NULL) return(ER_NOINDEX);
  3973.  
  3974.             polymesh->curpolyn=polyn;
  3975.  
  3976.             break;
  3977.         default :
  3978.             return(ER_NOTYPE);
  3979.     }
  3980.  
  3981.     return(ER_NOERROR);
  3982. }
  3983.  
  3984. /****** td.library/tdBegin ******************************************
  3985. *   NAME    
  3986. *     tdBegin -- Begin of a new child component.
  3987. *   SYNOPSIS
  3988. *    error = tdBegin( spacehandle,type)
  3989. *                     D1          D2
  3990. *
  3991. *    TDerrors tdBegin
  3992. *         ( ULONG,TDenum );
  3993. *
  3994. *   FUNCTION
  3995. *    You can start to make a new child component to the
  3996. *    current component of the space.
  3997. *    In most cases for object components only.
  3998. *    Type specifies which child component.
  3999. *   INPUTS
  4000. *     spacehandle     - A valid handle of a space.
  4001. *    type            - Type of the child component.
  4002. *    
  4003. *   RESULT
  4004. *     error - ER_NOERROR     if all went well.
  4005. *            ER_NOSPACE     if the handle is not valid.
  4006. *            ER_NOOBJECT    if there is no current object..
  4007. *            ER_NOMATGROUP  if there is no current material group.
  4008. *            ER_NOTYPE      if the type is not valid.
  4009. *            ER_NOMEMORY    if there is not enough memory.
  4010. *
  4011. *   EXAMPLE
  4012. *    error = tdBegin(spacehandle,TD_POLYGON);
  4013. *
  4014. *   NOTES
  4015. *    Vertices have to be added in counterclock wise direction.
  4016. *
  4017. *          v3
  4018. *         / |
  4019. *        /  |
  4020. *       /   |
  4021. *      /    |
  4022. *     /     |
  4023. *    v1--->v2
  4024. *
  4025. *   BUGS
  4026. *   SEE ALSO
  4027. *     tdCurrent(),tdEnd()
  4028. ******************************************************************************
  4029. *
  4030. */
  4031. TDerrors __saveds ASM tdBegin(register __d1 ULONG spacehandle,
  4032.                                 register __d2 TDenum type) {
  4033.     TDspace        *space=NULL;
  4034.     TDpolymesh        *polymesh=NULL;
  4035.     TDmatgroupnode    *matgroupnode=NULL;
  4036.     TDpolygonnode    *polynode=NULL;
  4037.  
  4038.     space=(TDspace *) spacehandle;
  4039.     if (space==NULL) return(ER_NOSPACE);
  4040.  
  4041.     // set the current component according the type
  4042.     switch(type) {
  4043.         case TD_MATGROUP :
  4044.             // check the parent
  4045.             if(space->curobjn==NULL) return(ER_NOOBJECT);
  4046.             if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4047.  
  4048.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  4049.  
  4050.             // create the new matgroup node
  4051.             matgroupnode=addMatGroupNode(polymesh,space->curmatn);
  4052.             if(matgroupnode==NULL) return(ER_NOMEMORY);
  4053.  
  4054.             // assign this matgroup node to the mesh
  4055.             polymesh->curmatgroupn=matgroupnode;
  4056.  
  4057.             break;
  4058.  
  4059.         case TD_POLYGON :
  4060.             // check the parent
  4061.             if(space->curobjn==NULL) return(ER_NOOBJECT);
  4062.             if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4063.  
  4064.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  4065.  
  4066.             // check the current matgroup
  4067.             if(polymesh->curmatgroupn==NULL) return(ER_NOMATGROUP);
  4068.  
  4069.             matgroupnode=polymesh->curmatgroupn;
  4070.  
  4071.             // Create a new polygon, add it to the internal list
  4072.             if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  4073.  
  4074.             polymesh->curpolyn=polynode;
  4075.  
  4076.             break;
  4077.         default :
  4078.             return(ER_NOTYPE);
  4079.     }
  4080.  
  4081.     return(ER_NOERROR);
  4082. }
  4083.  
  4084. /****** td.library/tdEnd ******************************************
  4085. *   NAME    
  4086. *     tdEnd -- Ends a child component started with tdBegin, or
  4087. *             resets a (child) component set with tdCurrent.
  4088. *   SYNOPSIS
  4089. *    error = tdEnd( spacehandle,type)
  4090. *                   D1          D2
  4091. *
  4092. *    TDerrors tdEnd
  4093. *         ( ULONG,TDenum );
  4094. *
  4095. *   FUNCTION
  4096. *    The component of the space will be reset.
  4097. *    Or the child component of a parent.
  4098. *    Type specifies which component.
  4099. *   INPUTS
  4100. *     spacehandle     - A valid handle of a space.
  4101. *    type            - The component its type.
  4102. *    
  4103. *   RESULT
  4104. *     error - ER_NOERROR     if all went well.
  4105. *            ER_NOSPACE     if the handle is not valid.
  4106. *            ER_NOOBJECT    if there is no current object.
  4107. *            ER_NOTYPE      if the type is not valid.
  4108. *
  4109. *   EXAMPLE
  4110. *    error = tdEnd(spacehandle,TD_POLYGON);
  4111. *
  4112. *   NOTES
  4113. *
  4114. *   BUGS
  4115. *   SEE ALSO
  4116. *     tdBegin(),tdCurrent()
  4117. ******************************************************************************
  4118. *
  4119. */
  4120. TDerrors __saveds ASM tdEnd(register __d1 ULONG spacehandle,
  4121.                             register __d2 TDenum type) {
  4122.     TDspace        *space=NULL;
  4123.     TDpolymesh        *polymesh=NULL;
  4124.  
  4125.     space=(TDspace *) spacehandle;
  4126.     if (space==NULL) return(ER_NOSPACE);
  4127.  
  4128.     // reset the current component according the type
  4129.     switch(type) {
  4130.         case TD_OBJECT :
  4131.             space->curobjn=NULL;
  4132.  
  4133.             break;
  4134.         case TD_MATERIAL :
  4135.             space->curmatn=NULL;
  4136.  
  4137.             break;
  4138.         case TD_MATGROUP :
  4139.             // check the parent
  4140.             if(space->curobjn==NULL) return(ER_NOOBJECT);
  4141.             if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4142.  
  4143.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  4144.  
  4145.             polymesh->curmatgroupn=NULL;
  4146.  
  4147.             // no matgroup => no polygon
  4148.             polymesh->curpolyn=NULL;
  4149.  
  4150.             break;
  4151.         case TD_POLYGON :
  4152.             // check the parent
  4153.             if(space->curobjn==NULL) return(ER_NOOBJECT);
  4154.             if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4155.  
  4156.             polymesh=(TDpolymesh *)(space->curobjn->handle);
  4157.  
  4158.             polymesh->curpolyn=NULL;
  4159.  
  4160.             break;
  4161.         default :
  4162.             return(ER_NOTYPE);
  4163.     }
  4164.  
  4165.     return(ER_NOERROR);
  4166. }
  4167.  
  4168. /****** td.library/tdVertexAdd3f *************************************************
  4169. *   NAME    
  4170. *     tdVertexAdd3f -- Add a new vertex to the current object its
  4171. *                     vertex list or to the current polygon,
  4172. *                     this according the CTM.
  4173. *
  4174. *   SYNOPSIS
  4175. *    error = tdVertexAdd3f( spacehandle,x, y, z )
  4176. *                           D1          D2 D3 D4
  4177. *
  4178. *    TDerrors tdVertexAdd3f
  4179. *         ( ULONG,TDfloat,TDfloat,TDfloat );
  4180. *
  4181. *   FUNCTION
  4182. *    A new vertex will be added to the current object its vertex list.
  4183. *   If tdBegin or tdCurrent was called before it will be assigned
  4184. *    to the current polygon, else it will only be added to the object,
  4185. *    binding to a polygon can be made later.
  4186. *   The index of the new vertex will be the new number of vertices
  4187. *    count.
  4188. *   INPUTS
  4189. *     spacehandle   - A valid handle of a space.
  4190. *    x,y,z         - The coordinates of the new vertex.
  4191. *    
  4192. *   RESULT
  4193. *     error - ER_NOERROR    if all went well.
  4194. *            ER_NOSPACE    if the handle is not valid.
  4195. *            ER_NOOBJECT   if there is no current object.
  4196. *            ER_NOMEMORY   if there is not enough memory. 
  4197. *   EXAMPLE
  4198. *    error = tdVertexAdd3f(spacehandle,1.0,2.0,3.0);
  4199. *
  4200. *   NOTES
  4201. *    Vertices have to be added in counterclock wise direction.
  4202. *
  4203. *          v3
  4204. *         / |
  4205. *        /  |
  4206. *       /   |
  4207. *      /    |
  4208. *     /     |
  4209. *    v1--->v2
  4210. *
  4211. *   BUGS
  4212. *   SEE ALSO
  4213. *     tdVertexGet(),
  4214. *    tdVertexIndexGet(),tdVertexAssign()
  4215. ******************************************************************************
  4216. *
  4217. */
  4218. TDerrors __saveds ASM tdVertexAdd3f(register __d1 ULONG spacehandle,
  4219.                                     register __d2 TDfloat x,
  4220.                                     register __d3 TDfloat y,
  4221.                                     register __d4 TDfloat z) {
  4222.                                 
  4223.     TDspace        *space=NULL;
  4224.     TDpolymesh        *mesh=NULL;
  4225.     TDvectord        vertex;
  4226.     ULONG            vindex;
  4227.  
  4228.     vertex.x=x,vertex.y=y,vertex.z=z;
  4229.     
  4230.     space=(TDspace *) spacehandle;
  4231.     if (space==NULL) return(ER_NOSPACE);
  4232.  
  4233.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4234.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4235.  
  4236.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4237.  
  4238.     if((vindex=addVertex(mesh,space->ctm,vertex))==0) return(ER_NOMEMORY);
  4239.  
  4240.     // check if we have to assign it to a current polygon
  4241.     if(mesh->curpolyn!=NULL) {
  4242.         if(assignVertex(mesh,mesh->curmatgroupn,mesh->curpolyn,vindex)==0) return(ER_NOMEMORY);
  4243.     }
  4244.  
  4245.     return(ER_NOERROR);
  4246. }
  4247.  
  4248. /****** td.library/tdVertexGet3d *************************************************
  4249. *   NAME    
  4250. *     tdVertexGet3d -- Get a vertex of the current object its vertex list. If a
  4251. *                     current polygon is set the vertexindex is assumed
  4252. *                     to be out of the polygon and you will get the vertex
  4253. *                     of the polygon.
  4254. *
  4255. *   SYNOPSIS
  4256. *    error = tdVertexGet3d( spacehandle,vertexindex,x, y, z )
  4257. *                           D1          D2          D3 D4 D5
  4258. *
  4259. *    TDerrors tdVertexGet3d
  4260. *         ( ULONG,ULONG,TDdouble *,TDdouble *,TDdouble * );
  4261. *
  4262. *   FUNCTION
  4263. *    The vertex of the current object found with vertexindex
  4264. *    will be returned in the passed 3 coordinate variables.
  4265. *    Or if a current polygon is set you will get
  4266. *    the vertex of the polygon.
  4267. *   INPUTS
  4268. *     spacehandle  - A valid handle of a space.
  4269. *    vertexindex  - A valid index of a vertex.
  4270. *    x,y,z        - The double variables which will contain 
  4271. *                   the coordinates of the vertex.
  4272. *    
  4273. *   RESULT
  4274. *     error - ER_NOERROR    if all went well.
  4275. *            ER_NOSPACE    if the handle is not valid.
  4276. *            ER_NOOBJECT   if there is no current object.
  4277. *            ER_NOVERTEX   if the index is not valid.
  4278. *   EXAMPLE
  4279. *    error = tdVertexGet3d(spacehandle,vertexindex,&x,&y,&z);
  4280. *
  4281. *   NOTES
  4282. *
  4283. *   BUGS
  4284. *   SEE ALSO
  4285. *     tdVertexAdd(),
  4286. *    tdVertexIndexGet(),tdVertexAssign()
  4287. ******************************************************************************
  4288. *
  4289. */
  4290. TDerrors __saveds ASM tdVertexGet3d(register __d1 ULONG spacehandle,
  4291.                                     register __d2 ULONG vertexindex,
  4292.                                     register __d3 TDdouble *x,
  4293.                                     register __d4 TDdouble *y,
  4294.                                     register __d5 TDdouble *z) {
  4295.                                 
  4296.     TDspace    *space=NULL;
  4297.     TDpolymesh    *mesh=NULL;
  4298.     TDvectord    *vertex=NULL;
  4299.     ULONG        vindex;
  4300.       
  4301.     space=(TDspace *) spacehandle;
  4302.     if (space==NULL) return(ER_NOSPACE);
  4303.  
  4304.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4305.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4306.  
  4307.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4308.     // check if the mesh its vertex or the one of the current polygon
  4309.     if(mesh->curpolyn==NULL) {
  4310.         vindex=vertexindex;
  4311.     } else {
  4312.         if(vertexindex<1 || vertexindex>mesh->curpolyn->numberOfVertices) return(ER_NOVERTEX);
  4313.         // internal index = - 1
  4314.         vindex=mesh->curpolyn->varray[vertexindex-1];
  4315.     }
  4316.  
  4317.     vertex=getVertex(mesh,vindex);
  4318.     if(vertex==NULL) return(ER_NOVERTEX);
  4319.  
  4320.     (*x)=vertex->x;
  4321.     (*y)=vertex->y;
  4322.     (*z)=vertex->z;
  4323.  
  4324.     return(ER_NOERROR);
  4325. }
  4326.  
  4327. /****** td.library/tdVertexGet3f *************************************************
  4328. *   NAME    
  4329. *     tdVertexGet3f -- Get a vertex of the current object its vertex list. If a
  4330. *                     current polygon is set the vertexindex is assumed
  4331. *                     to be out of the polygon and you will get the vertex
  4332. *                     of the polygon.
  4333. *
  4334. *   SYNOPSIS
  4335. *    error = tdVertexGet3f( spacehandle,vertexindex,x, y, z )
  4336. *                           D1          D2          D3 D4 D5
  4337. *
  4338. *    TDerrors tdVertexGet3f
  4339. *         ( ULONG,ULONG,TDfloat *,TDfloat *,TDfloat * );
  4340. *
  4341. *   FUNCTION
  4342. *    The vertex of the current object found with vertexindex
  4343. *    will be returned in the passed 3 coordinate variables.
  4344. *    Or if a current polygon is set you will get
  4345. *    the vertex of the polygon.
  4346. *   INPUTS
  4347. *     spacehandle  - A valid handle of a space.
  4348. *    vertexindex  - A valid index of a vertex.
  4349. *    x,y,z        - The float variables which will contain 
  4350. *                   the coordinates of the vertex.
  4351. *    
  4352. *   RESULT
  4353. *     error - ER_NOERROR    if all went well.
  4354. *            ER_NOSPACE    if the handle is not valid.
  4355. *            ER_NOOBJECT   if there is no current object.
  4356. *            ER_NOVERTEX   if the index is not valid.
  4357. *   EXAMPLE
  4358. *    error = tdVertexGet3f(spacehandle,vertexindex,&x,&y,&z);
  4359. *
  4360. *   NOTES
  4361. *
  4362. *   BUGS
  4363. *   SEE ALSO
  4364. *     tdVertexAdd(),
  4365. *    tdVertexIndexGet(),tdVertexAssign()
  4366. ******************************************************************************
  4367. *
  4368. */
  4369. TDerrors __saveds ASM tdVertexGet3f(register __d1 ULONG spacehandle,
  4370.                                     register __d2 ULONG vertexindex,
  4371.                                     register __d3 TDfloat *x,
  4372.                                     register __d4 TDfloat *y,
  4373.                                     register __d5 TDfloat *z) {
  4374.                                 
  4375.     TDspace    *space=NULL;
  4376.     TDpolymesh    *mesh=NULL;
  4377.     TDvectord    *vertex=NULL;
  4378.     ULONG        vindex;
  4379.       
  4380.     space=(TDspace *) spacehandle;
  4381.     if (space==NULL) return(ER_NOSPACE);
  4382.  
  4383.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4384.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4385.  
  4386.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4387.     // check if the mesh its vertex or the one of the current polygon
  4388.     if(mesh->curpolyn==NULL) {
  4389.         vindex=vertexindex;
  4390.     } else {
  4391.         if(vertexindex<1 || vertexindex>mesh->curpolyn->numberOfVertices) return(ER_NOVERTEX);
  4392.         // internal index = - 1
  4393.         vindex=mesh->curpolyn->varray[vertexindex-1];
  4394.     }
  4395.  
  4396.     vertex=getVertex(mesh,vindex);
  4397.     if(vertex==NULL) return(ER_NOVERTEX);
  4398.  
  4399.     (*x)=vertex->x;
  4400.     (*y)=vertex->y;
  4401.     (*z)=vertex->z;
  4402.  
  4403.     return(ER_NOERROR);
  4404. }
  4405.  
  4406. /****** td.library/tdVertexAdddv *************************************************
  4407. *   NAME    
  4408. *     tdVertexAdddv -- Add a new vertex to the current object its
  4409. *                     vertex list or to the current polygon,
  4410. *                     this according the CTM.
  4411. *
  4412. *   SYNOPSIS
  4413. *    error = tdVertexAdddv( spacehandle,vertex )
  4414. *                           D1           A0
  4415. *
  4416. *    TDerrors tdVertexAdddv
  4417. *         ( ULONG,TDvectord * );
  4418. *
  4419. *   FUNCTION
  4420. *    A new vertex will be added to the current object its vertex list.
  4421. *    If tdBegin or tdCurrent was called before, it will be assigned
  4422. *    to the current polygon, else it will only be added to the object,
  4423. *    binding to a polygon can be made later.
  4424. *    The index of the new vertex will be the new number of vertices
  4425. *    count.
  4426. *   INPUTS
  4427. *     spacehandle  - A valid handle of a space.
  4428. *    vertex       - Pointer to a vector structure which contains the
  4429. *                   coordinates of the new vertex.
  4430. *    
  4431. *   RESULT
  4432. *     error - ER_NOERROR    if all went well.
  4433. *            ER_NOSPACE    if the handle is not valid.
  4434. *            ER_NOOBJECT   if there is no current object.
  4435. *            ER_NOMEMORY   if there is not enough memory. 
  4436. *   EXAMPLE
  4437. *    error = tdVertexAdddv(spacehandle,&myvertex);
  4438. *
  4439. *   NOTES
  4440. *    Vertices have to be added in counterclock wise direction.
  4441. *
  4442. *          v3
  4443. *         / |
  4444. *        /  |
  4445. *       /   |
  4446. *      /    |
  4447. *     /     |
  4448. *    v1--->v2
  4449. *
  4450. *   BUGS
  4451. *   SEE ALSO
  4452. *     tdVertexGet(),
  4453. *    tdVertexIndexGet(),tdVertexAssign()
  4454. ******************************************************************************
  4455. *
  4456. */
  4457. TDerrors __saveds ASM tdVertexAdddv(register __d1 ULONG spacehandle,
  4458.                                     register __a0 TDvectord *vertex) {
  4459.  
  4460.  
  4461.     TDspace        *space=NULL;
  4462.     TDpolymesh        *mesh=NULL;
  4463.     TDvectord        *mvertex=NULL;
  4464.     ULONG            vindex;
  4465.  
  4466.     mvertex=vertex;
  4467.     
  4468.     space=(TDspace *) spacehandle;
  4469.     if (space==NULL) return(ER_NOSPACE);
  4470.  
  4471.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4472.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4473.  
  4474.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4475.  
  4476.     if((vindex=addVertex(mesh,space->ctm,(*mvertex)))==0) return(ER_NOMEMORY);
  4477.  
  4478.     // check if we have to assign it to a current polygon
  4479.     if(mesh->curpolyn!=NULL) {
  4480.         if(assignVertex(mesh,mesh->curmatgroupn,mesh->curpolyn,vindex)==0) return(ER_NOMEMORY);
  4481.     }
  4482.  
  4483.     return(ER_NOERROR);
  4484. }
  4485.  
  4486. /****** td.library/tdVertexAddfv *************************************************
  4487. *   NAME    
  4488. *     tdVertexAddfv -- Add a new vertex to the current object its
  4489. *                     vertex list or to the current polygon,
  4490. *                     this according the CTM.
  4491. *
  4492. *   SYNOPSIS
  4493. *    error = tdVertexAddfv( spacehandle,vertex )
  4494. *                           D1           A0
  4495. *
  4496. *    TDerrors tdVertexAddfv
  4497. *         ( ULONG,TDvectorf * );
  4498. *
  4499. *   FUNCTION
  4500. *    A new vertex will be added to the current object its vertex list.
  4501. *    If tdBegin or tdCurrent was called before, it will be assigned
  4502. *    to the current polygon, else it will only be added to the object,
  4503. *    binding to a polygon can be made later.
  4504. *    The index of the new vertex will be the new number of vertices
  4505. *    count.
  4506. *   INPUTS
  4507. *     spacehandle  - A valid handle of a space.
  4508. *    vertex       - Pointer to a vector structure which contains the
  4509. *                   coordinates of the new vertex.
  4510. *    
  4511. *   RESULT
  4512. *     error - ER_NOERROR    if all went well.
  4513. *            ER_NOSPACE    if the handle is not valid.
  4514. *            ER_NOOBJECT   if there is no current object.
  4515. *            ER_NOMEMORY   if there is not enough memory. 
  4516. *   EXAMPLE
  4517. *    error = tdVertexAddfv(spacehandle,&myvertex);
  4518. *
  4519. *   NOTES
  4520. *    Vertices have to be added in counterclock wise direction.
  4521. *
  4522. *          v3
  4523. *         / |
  4524. *        /  |
  4525. *       /   |
  4526. *      /    |
  4527. *     /     |
  4528. *    v1--->v2
  4529. *
  4530. *   BUGS
  4531. *   SEE ALSO
  4532. *     tdVertexGet(),
  4533. *    tdVertexIndexGet(),tdVertexAssign()
  4534. ******************************************************************************
  4535. *
  4536. */
  4537. TDerrors __saveds ASM tdVertexAddfv(register __d1 ULONG spacehandle,
  4538.                                     register __a0 TDvectorf *vertex) {
  4539.  
  4540.  
  4541.     TDspace        *space=NULL;
  4542.     TDpolymesh        *mesh=NULL;
  4543.     TDvectord        mvertex;
  4544.     ULONG            vindex;
  4545.  
  4546.     mvertex.x=vertex->x;
  4547.     mvertex.y=vertex->y;
  4548.     mvertex.z=vertex->z;
  4549.  
  4550.     space=(TDspace *) spacehandle;
  4551.     if (space==NULL) return(ER_NOSPACE);
  4552.  
  4553.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4554.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4555.  
  4556.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4557.  
  4558.     if((vindex=addVertex(mesh,space->ctm,mvertex))==0) return(ER_NOMEMORY);
  4559.  
  4560.     // check if we have to assign it to a current polygon
  4561.     if(mesh->curpolyn!=NULL) {
  4562.         if(assignVertex(mesh,mesh->curmatgroupn,mesh->curpolyn,vindex)==0) return(ER_NOMEMORY);
  4563.     }
  4564.  
  4565.     return(ER_NOERROR);
  4566. }
  4567.  
  4568. /****** td.library/tdVertexAdd3da *************************************************
  4569. *   NAME    
  4570. *     tdVertexAdd3da -- Add a new vertex to the current object its
  4571. *                      vertex list or to the current polygon,
  4572. *                      this according the CTM.
  4573. *   SYNOPSIS
  4574. *    error = tdVertexAdd3da( spacehandle,array )
  4575. *                            D1           A0
  4576. *
  4577. *    TDerrors tdVertexAdd3da
  4578. *         ( ULONG,TDdouble [3] );
  4579. *
  4580. *   FUNCTION
  4581. *    A new vertex will be added to the current object its vertex list.
  4582. *    If tdBegin or tdCurrent was called before, it will be assigned
  4583. *    to the current polygon, else it will only be added to the object,
  4584. *    binding to a polygon can be made later.
  4585. *    The index of the new vertex will be the new number of vertices
  4586. *    count.
  4587. *   INPUTS
  4588. *     spacehandle  - A valid handle of a space.
  4589. *    array        - A double array which contains the coordinates
  4590. *                   of the new vertex.
  4591. *    
  4592. *   RESULT
  4593. *     error - ER_NOERROR    if all went well.
  4594. *            ER_NOSPACE    if the handle is not valid.
  4595. *            ER_NOOBJECT   if there is no current object.
  4596. *            ER_NOMEMORY   if there is not enough memory. 
  4597. *   EXAMPLE
  4598. *    error = tdVertexAdd3da(spacehandle,myvertex);
  4599. *
  4600. *   NOTES
  4601. *    Vertices have to be added in counterclock wise direction.
  4602. *
  4603. *          v3
  4604. *         / |
  4605. *        /  |
  4606. *       /   |
  4607. *      /    |
  4608. *     /     |
  4609. *    v1--->v2
  4610. *
  4611. *   BUGS
  4612. *   SEE ALSO
  4613. *     tdVertexGet(),
  4614. *    tdVertexIndexGet(),tdVertexAssign()
  4615. ******************************************************************************
  4616. *
  4617. */
  4618. TDerrors __saveds ASM tdVertexAdd3da(register __d1 ULONG spacehandle,
  4619.                                     register __a0 TDdouble array[3]) {
  4620.  
  4621.     TDspace        *space=NULL;
  4622.     TDpolymesh        *mesh=NULL;
  4623.     TDvectord        mvertex;
  4624.     ULONG            vindex;
  4625.  
  4626.     mvertex.x=array[0];
  4627.     mvertex.y=array[1];
  4628.     mvertex.z=array[2];
  4629.  
  4630.     space=(TDspace *) spacehandle;
  4631.     if (space==NULL) return(ER_NOSPACE);
  4632.  
  4633.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4634.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4635.  
  4636.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4637.  
  4638.     if((vindex=addVertex(mesh,space->ctm,mvertex))==0) return(ER_NOMEMORY);
  4639.  
  4640.     // check if we have to assign it to a current polygon
  4641.     if(mesh->curpolyn!=NULL) {
  4642.         if(assignVertex(mesh,mesh->curmatgroupn,mesh->curpolyn,vindex)==0) return(ER_NOMEMORY);
  4643.     }
  4644.  
  4645.     return(ER_NOERROR);
  4646. }
  4647.  
  4648. /****** td.library/tdVertexAdd3fa *************************************************
  4649. *   NAME    
  4650. *     tdVertexAdd3fa -- Add a new vertex to the current object its
  4651. *                      vertex list or to the current polygon,
  4652. *                      this according the CTM.
  4653. *   SYNOPSIS
  4654. *    error = tdVertexAdd3fa( spacehandle,array )
  4655. *                            D1           A0
  4656. *
  4657. *    TDerrors tdVertexAdd3fa
  4658. *         ( ULONG,TDfloat [3] );
  4659. *
  4660. *   FUNCTION
  4661. *    A new vertex will Âµbe added to the current object its vertex list.
  4662. *    If tdBegin or tdCurrent was called before, it will be assigned
  4663. *    to the current polygon, else it will only be added to the object,
  4664. *    binding to a polygon can be made later.
  4665. *    The index of the new vertex will be the new number of vertices
  4666. *    count.
  4667. *   INPUTS
  4668. *     spacehandle  - A valid handle of a space.
  4669. *    array        - A float array which contains the coordinates
  4670. *                   of the new vertex.
  4671. *    
  4672. *   RESULT
  4673. *     error - ER_NOERROR    if all went well.
  4674. *            ER_NOSPACE    if the handle is not valid.
  4675. *            ER_NOOBJECT   if there is no current object.
  4676. *            ER_NOMEMORY   if there is not enough memory. 
  4677. *   EXAMPLE
  4678. *    error = tdVertexAdd3fa(spacehandle,myvertex);
  4679. *
  4680. *   NOTES
  4681. *    Vertices have to be added in counterclock wise direction.
  4682. *
  4683. *          v3
  4684. *         / |
  4685. *        /  |
  4686. *       /   |
  4687. *      /    |
  4688. *     /     |
  4689. *    v1--->v2
  4690. *
  4691. *   BUGS
  4692. *   SEE ALSO
  4693. *     tdVertexGet(),
  4694. *    tdVertexIndexGet(),tdVertexAssign()
  4695. ******************************************************************************
  4696. *
  4697. */
  4698. TDerrors __saveds ASM tdVertexAdd3fa(register __d1 ULONG spacehandle,
  4699.                                     register __a0 TDfloat array[3]) {
  4700.  
  4701.     TDspace        *space=NULL;
  4702.     TDpolymesh        *mesh=NULL;
  4703.     TDvectord        mvertex;
  4704.     ULONG            vindex;
  4705.  
  4706.     mvertex.x=array[0];
  4707.     mvertex.y=array[1];
  4708.     mvertex.z=array[2];
  4709.  
  4710.     space=(TDspace *) spacehandle;
  4711.     if (space==NULL) return(ER_NOSPACE);
  4712.  
  4713.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4714.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4715.  
  4716.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4717.  
  4718.     if((vindex=addVertex(mesh,space->ctm,mvertex))==0) return(ER_NOMEMORY);
  4719.  
  4720.     // check if we have to assign it to a current polygon
  4721.     if(mesh->curpolyn!=NULL) {
  4722.         if(assignVertex(mesh,mesh->curmatgroupn,mesh->curpolyn,vindex)==0) return(ER_NOMEMORY);
  4723.     }
  4724.  
  4725.     return(ER_NOERROR);
  4726. }
  4727.  
  4728. /****** td.library/tdVertexGetdv *************************************************
  4729. *   NAME    
  4730. *     tdVertexGetdv -- Get a vertex of the current object its vertex list. If a
  4731. *                     current polygon is set the vertexindex is assumed
  4732. *                     to be out of the polygon and you will get the vertex
  4733. *                     of the polygon.
  4734. *
  4735. *   SYNOPSIS
  4736. *    error = tdVertexGetdv( spacehandle,vertexindex,vertex )
  4737. *                           D1          D2           A0
  4738. *
  4739. *    TDerrors tdVertexGetdv
  4740. *         ( ULONG,ULONG,TDvectord * );
  4741. *
  4742. *   FUNCTION
  4743. *    The vertex of the current object found with vertexindex
  4744. *    will be returned in the passed vector structure.
  4745. *    Or if a current polygon is set you will get
  4746. *    the vertex of the polygon.
  4747. *   INPUTS
  4748. *     spacehandle  - A valid handle of a space.
  4749. *    vertexindex  - A valid handle of a vertex
  4750. *    vertex       - Pointer to a vector structure which will contain
  4751. *                   the coordinates of the vertex.
  4752. *    
  4753. *   RESULT
  4754. *     error - ER_NOERROR    if all went well.
  4755. *            ER_NOSPACE    if the handle is not valid.
  4756. *            ER_NOOBJECT   if there is no current object.
  4757. *            ER_NOVERTEX   if the index is not valid.
  4758. *   EXAMPLE
  4759. *    error = tdVertexGetdv(spacehandle,67,&myvertex);
  4760. *
  4761. *   NOTES
  4762. *
  4763. *   BUGS
  4764. *   SEE ALSO
  4765. *     tdVertexAdd(),
  4766. *    tdVertexIndexGet(),tdVertexAssign()
  4767. ******************************************************************************
  4768. *
  4769. */
  4770. TDerrors __saveds ASM tdVertexGetdv(register __d1 ULONG spacehandle,
  4771.                                     register __d2 ULONG vertexindex,
  4772.                                     register __a0 TDvectord *vertex) {
  4773.  
  4774.     TDspace    *space=NULL;
  4775.     TDpolymesh    *mesh=NULL;
  4776.     TDvectord    *mvertex=NULL;
  4777.     ULONG        vindex;
  4778.       
  4779.     space=(TDspace *) spacehandle;
  4780.     if (space==NULL) return(ER_NOSPACE);
  4781.  
  4782.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4783.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4784.  
  4785.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4786.     // check if the mesh its vertex or the one of the current polygon
  4787.     if(mesh->curpolyn==NULL) {
  4788.         vindex=vertexindex;
  4789.     } else {
  4790.         if(vertexindex<1 || vertexindex>mesh->curpolyn->numberOfVertices) return(ER_NOVERTEX);
  4791.         // internal index = - 1
  4792.         vindex=mesh->curpolyn->varray[vertexindex-1];
  4793.     }
  4794.  
  4795.     mvertex=getVertex(mesh,vindex);
  4796.     if(mvertex==NULL) return(ER_NOVERTEX);
  4797.  
  4798.     vertex->x=mvertex->x;
  4799.     vertex->y=mvertex->y;
  4800.     vertex->z=mvertex->z;
  4801.  
  4802.     return(ER_NOERROR);
  4803. }
  4804.  
  4805. /****** td.library/tdVertexGetfv *************************************************
  4806. *   NAME    
  4807. *     tdVertexGetfv -- Get a vertex of the current object its vertex list. If a
  4808. *                     current polygon is set the vertexindex is assumed
  4809. *                     to be out of the polygon and you will get the vertex
  4810. *                     of the polygon.
  4811. *
  4812. *   SYNOPSIS
  4813. *    error = tdVertexGetfv( spacehandle,vertexindex,vertex )
  4814. *                           D1          D2           A0
  4815. *
  4816. *    TDerrors tdVertexGetfv
  4817. *         ( ULONG,ULONG,TDvectorf * );
  4818. *
  4819. *   FUNCTION
  4820. *    The vertex of the current object found with vertexindex
  4821. *    will be returned in the passed vector structure.
  4822. *    Or if a current polygon is set you will get
  4823. *    the vertex of the polygon.
  4824. *   INPUTS
  4825. *     spacehandle  - A valid handle of a space.
  4826. *    vertexindex  - A valid handle of a vertex
  4827. *    vertex       - Pointer to a vector structure which will contain
  4828. *                   the coordinates of the vertex.
  4829. *    
  4830. *   RESULT
  4831. *     error - ER_NOERROR    if all went well.
  4832. *            ER_NOSPACE    if the handle is not valid.
  4833. *            ER_NOOBJECT   if there is no current object.
  4834. *            ER_NOVERTEX   if the index is not valid.
  4835. *   EXAMPLE
  4836. *    error = tdVertexGetfv(spacehandle,32,&myvertex);
  4837. *
  4838. *   NOTES
  4839. *
  4840. *   BUGS
  4841. *   SEE ALSO
  4842. *     tdVertexAdd(),
  4843. *    tdVertexIndexGet(),tdVertexAssign()
  4844. ******************************************************************************
  4845. *
  4846. */
  4847. TDerrors __saveds ASM tdVertexGetfv(register __d1 ULONG spacehandle,
  4848.                                     register __d2 ULONG vertexindex,
  4849.                                     register __a0 TDvectorf *vertex) {
  4850.  
  4851.     TDspace    *space=NULL;
  4852.     TDpolymesh    *mesh=NULL;
  4853.     TDvectord    *mvertex=NULL;
  4854.     ULONG        vindex;
  4855.       
  4856.     space=(TDspace *) spacehandle;
  4857.     if (space==NULL) return(ER_NOSPACE);
  4858.  
  4859.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4860.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4861.  
  4862.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4863.     // check if the mesh its vertex or the one of the current polygon
  4864.     if(mesh->curpolyn==NULL) {
  4865.         vindex=vertexindex;
  4866.     } else {
  4867.         if(vertexindex<1 || vertexindex>mesh->curpolyn->numberOfVertices) return(ER_NOVERTEX);
  4868.         // internal index = - 1
  4869.         vindex=mesh->curpolyn->varray[vertexindex-1];
  4870.     }
  4871.  
  4872.     mvertex=getVertex(mesh,vindex);
  4873.     if(mvertex==NULL) return(ER_NOVERTEX);
  4874.  
  4875.     vertex->x=mvertex->x;
  4876.     vertex->y=mvertex->y;
  4877.     vertex->z=mvertex->z;
  4878.  
  4879.     return(ER_NOERROR);
  4880. }
  4881.  
  4882. /****** td.library/tdVertexGet3da *************************************************
  4883. *   NAME    
  4884. *     tdVertexGet3da -- Get a vertex of the current object its vertex list. If a
  4885. *                      current polygon is set the vertexindex is assumed
  4886. *                      to be out of the polygon and you will get the vertex
  4887. *                      of the polygon.
  4888. *
  4889. *   SYNOPSIS
  4890. *    error = tdVertexGet3da( spacehandle,vertexindex,array )
  4891. *                            D1          D2           A0
  4892. *
  4893. *    TDerrors tdVertexGet3da
  4894. *         ( ULONG,ULONG,TDdouble [3] );
  4895. *
  4896. *   FUNCTION
  4897. *    The vertex of the current object found with vertexindex
  4898. *    will be returned in the passed double array.
  4899. *    Or if a current polygon is set you will get
  4900. *    the vertex of the polygon.
  4901. *   INPUTS
  4902. *     spacehandle  - A valid handle of a space.
  4903. *    vertexindex  - A valid handle of a vertex
  4904. *    array        - A correct sized double array which will contain
  4905. *                   the coordinates of the vertex.
  4906. *    
  4907. *   RESULT
  4908. *     error - ER_NOERROR    if all went well.
  4909. *            ER_NOSPACE    if the handle is not valid.
  4910. *            ER_NOOBJECT   if there is no current object.
  4911. *            ER_NOVERTEX   if the index is not valid.
  4912. *   EXAMPLE
  4913. *    error = tdVertexGet3da(spacehandle,17,array);
  4914. *
  4915. *   NOTES
  4916. *
  4917. *   BUGS
  4918. *   SEE ALSO
  4919. *     tdVertexAdd(),
  4920. *    tdVertexIndexGet(),tdVertexAssign()
  4921. ******************************************************************************
  4922. *
  4923. */
  4924. TDerrors __saveds ASM tdVertexGet3da(register __d1 ULONG spacehandle,
  4925.                                     register __d2 ULONG vertexindex,
  4926.                                     register __a0 TDdouble array[3]) {
  4927.  
  4928.     TDspace    *space=NULL;
  4929.     TDpolymesh    *mesh=NULL;
  4930.     TDvectord    *mvertex=NULL;
  4931.     TDdouble    *marray=NULL;
  4932.     ULONG        vindex;
  4933.  
  4934.     // make a copy of the array, a0 is a scratch register
  4935.     marray=array;
  4936.       
  4937.     space=(TDspace *) spacehandle;
  4938.     if (space==NULL) return(ER_NOSPACE);
  4939.  
  4940.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  4941.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  4942.  
  4943.     mesh=(TDpolymesh *)(space->curobjn->handle);
  4944.     // check if the mesh its vertex or the one of the current polygon
  4945.     if(mesh->curpolyn==NULL) {
  4946.         vindex=vertexindex;
  4947.     } else {
  4948.         if(vertexindex<1 || vertexindex>mesh->curpolyn->numberOfVertices) return(ER_NOVERTEX);
  4949.         // internal index = - 1
  4950.         vindex=mesh->curpolyn->varray[vertexindex-1];
  4951.     }
  4952.  
  4953.     mvertex=getVertex(mesh,vindex);
  4954.     if(mvertex==NULL) return(ER_NOVERTEX);
  4955.  
  4956.     marray[0]=mvertex->x;
  4957.     marray[1]=mvertex->y;
  4958.     marray[2]=mvertex->z;
  4959.  
  4960.     return(ER_NOERROR);
  4961. }
  4962.  
  4963. /****** td.library/tdVertexGet3fa *************************************************
  4964. *   NAME    
  4965. *     tdVertexGet3fa -- Get a vertex of the current object its vertex list. If a
  4966. *                      current polygon is set the vertexindex is assumed
  4967. *                      to be out of the polygon and you will get the vertex
  4968. *                      of the polygon.
  4969. *
  4970. *   SYNOPSIS
  4971. *    error = tdVertexGet3fa( spacehandle,vertexindex,array )
  4972. *                            D1          D2           A0
  4973. *
  4974. *    TDerrors tdVertexGet3fa
  4975. *         ( ULONG,ULONG,TDfloat [3] );
  4976. *
  4977. *   FUNCTION
  4978. *    The vertex of the current object found with vertexindex
  4979. *    will be returned in the passed float array.
  4980. *    Or if a current polygon is set you will get
  4981. *    the vertex of the polygon.
  4982. *   INPUTS
  4983. *     spacehandle  - A valid handle of a space.
  4984. *    vertexindex  - A valid handle of a vertex
  4985. *    array        - A correct sized float array which will contain
  4986. *                   the coordinates of the vertex.
  4987. *    
  4988. *   RESULT
  4989. *     error - ER_NOERROR    if all went well.
  4990. *            ER_NOSPACE    if the handle is not valid.
  4991. *            ER_NOOBJECT   if there is no current object.
  4992. *            ER_NOVERTEX   if the index is not valid.
  4993. *   EXAMPLE
  4994. *    error = tdVertexGet3fa(spacehandle,17,array);
  4995. *
  4996. *   NOTES
  4997. *
  4998. *   BUGS
  4999. *   SEE ALSO
  5000. *     tdVertexAdd(),
  5001. *    tdVertexIndexGet(),tdVertexAssign()
  5002. ******************************************************************************
  5003. *
  5004. */
  5005. TDerrors __saveds ASM tdVertexGet3fa(register __d1 ULONG spacehandle,
  5006.                                     register __d2 ULONG vertexindex,
  5007.                                     register __a0 TDfloat array[3]) {
  5008.  
  5009.     TDspace    *space=NULL;
  5010.     TDpolymesh    *mesh=NULL;
  5011.     TDvectord    *mvertex=NULL;
  5012.     TDfloat    *marray=NULL;
  5013.     ULONG        vindex;
  5014.  
  5015.     // make a copy of the array, a0 is a scratch register
  5016.     marray=array;
  5017.       
  5018.     space=(TDspace *) spacehandle;
  5019.     if (space==NULL) return(ER_NOSPACE);
  5020.  
  5021.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5022.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5023.  
  5024.     mesh=(TDpolymesh *)(space->curobjn->handle);
  5025.     // check if the mesh its vertex or the one of the current polygon
  5026.     if(mesh->curpolyn==NULL) {
  5027.         vindex=vertexindex;
  5028.     } else {
  5029.         if(vertexindex<1 || vertexindex>mesh->curpolyn->numberOfVertices) return(ER_NOVERTEX);
  5030.         // internal index = - 1
  5031.         vindex=mesh->curpolyn->varray[vertexindex-1];
  5032.     }
  5033.  
  5034.     mvertex=getVertex(mesh,vindex);
  5035.     if(mvertex==NULL) return(ER_NOVERTEX);
  5036.  
  5037.     marray[0]=mvertex->x;
  5038.     marray[1]=mvertex->y;
  5039.     marray[2]=mvertex->z;
  5040.  
  5041.     return(ER_NOERROR);
  5042. }
  5043.  
  5044. /****** td.library/tdQuadAdd4dv ******************************************
  5045. *   NAME    
  5046. *     tdQuadAdd4dv -- Add a new polygon with 4 vertices to the
  5047. *                    current object, this according the CTM.
  5048. *                    The polygon will have the current
  5049. *                    material.
  5050. *
  5051. *   SYNOPSIS
  5052. *    error = tdQuadAdd4dv
  5053. *              ( spacehandle,vertex1,vertex2,vertex3,vertex4 )
  5054. *                D1           A0       A1      A2     A3
  5055. *
  5056. *    TDerrors tdQuadAdd4dv
  5057. *         ( ULONG,TDvectord *,TDvectord *,TDvectord *,TDvectord * );
  5058. *
  5059. *   FUNCTION
  5060. *    A new polygon with 4 vertices will be automatically created.
  5061. *    The vertices added to the current object its list and
  5062. *    assigned to the new polygon which will have the 
  5063. *    current material.
  5064. *
  5065. *    A copy of the contents passed by the vector pointers will be made.
  5066. *    The current polygon of the object will be reset, and not set to this one !
  5067. *   INPUTS
  5068. *     spacehandle    - A valid handle of a space.
  5069. *    vertex1        - Pointer to the first veretex.
  5070. *    vertex2        - Pointer to the second vertex.
  5071. *    vertex3        - Pointer to the third vertex.
  5072. *    vertex4        - Pointer to the fourth vertex.
  5073. *    
  5074. *   RESULT
  5075. *     error - ER_NOERROR    if all went well.
  5076. *            ER_NOSPACE    if the handle is not valid.
  5077. *            ER_NOOBJECT   if there is no current object.
  5078. *            ER_NOMATGROUP if there is no current material group.
  5079. *            ER_NOMEMORY   if there is not enough memory. 
  5080. *   EXAMPLE
  5081. *    error = tdQuadAdd4dv(spacehandle,&v1,&v2,&v3,&v4);
  5082. *
  5083. *   NOTES
  5084. *    Vertices have to be added in counterclock wise direction.
  5085. *
  5086. *    v4----v3
  5087. *    |      |
  5088. *    |      |
  5089. *    |      |
  5090. *    |      |
  5091. *    |      |
  5092. *    v1--->v2
  5093. *
  5094. *   BUGS
  5095. *   SEE ALSO
  5096. *     tdTriangleAdd()
  5097. ******************************************************************************
  5098. *
  5099. */
  5100. TDerrors __saveds ASM tdQuadAdd4dv(register __d1 ULONG spacehandle,
  5101.                                     register __a0 TDvectord *vertex1,
  5102.                                     register __a1 TDvectord *vertex2,
  5103.                                     register __a2 TDvectord *vertex3,
  5104.                                     register __a3 TDvectord *vertex4) {
  5105.  
  5106.     TDspace        *space=NULL;
  5107.     TDpolymesh        *polymesh=NULL;
  5108.     TDmatgroupnode    *matgroupnode=NULL;
  5109.     TDpolygonnode    *polynode=NULL;
  5110.     TDvectord        *mvertex1=NULL,*mvertex2=NULL,
  5111.                     *mvertex3=NULL,*mvertex4=NULL;
  5112.     ULONG            vindex;
  5113.  
  5114.     // make a copy of vertex1 to 4, a0 and a1 are a scratch registers
  5115.     mvertex1=vertex1;
  5116.     mvertex2=vertex2;
  5117.     mvertex3=vertex3;
  5118.     mvertex4=vertex4;
  5119.  
  5120.     space=(TDspace *) spacehandle;
  5121.     if (space==NULL) return(ER_NOSPACE);
  5122.  
  5123.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5124.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5125.  
  5126.     polymesh=(TDpolymesh *)(space->curobjn->handle);
  5127.         
  5128.     // get the matgroup
  5129.     matgroupnode=polymesh->curmatgroupn;
  5130.     if(matgroupnode==NULL) return(ER_NOMATGROUP);
  5131.  
  5132.     // Create a new polygon, add it to the internal list
  5133.     if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  5134.  
  5135.     polymesh->curpolyn=NULL;
  5136.  
  5137.     if((vindex=addVertex(polymesh,space->ctm,(*mvertex1)))==0) return(ER_NOMEMORY);
  5138.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5139.     if((vindex=addVertex(polymesh,space->ctm,(*mvertex2)))==0) return(ER_NOMEMORY);
  5140.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5141.     if((vindex=addVertex(polymesh,space->ctm,(*mvertex3)))==0) return(ER_NOMEMORY);
  5142.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5143.     if((vindex=addVertex(polymesh,space->ctm,(*mvertex4)))==0) return(ER_NOMEMORY);
  5144.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5145.  
  5146.     return(ER_NOERROR);
  5147. }
  5148.  
  5149. /****** td.library/tdQuadAdd4fv ******************************************
  5150. *   NAME    
  5151. *     tdQuadAdd4fv -- Add a new polygon with 4 vertices to the
  5152. *                    current object, this according the CTM.
  5153. *                    The polygon will have the current
  5154. *                    material.
  5155. *
  5156. *   SYNOPSIS
  5157. *    error = tdQuadAdd4fv
  5158. *              ( spacehandle,vertex1,vertex2,vertex3,vertex4 )
  5159. *                D1           A0       A1      A2     A3
  5160. *
  5161. *    TDerrors tdQuadAdd4fv
  5162. *         ( ULONG,TDvectorf *,TDvectorf *,TDvectorf *,TDvectorf * );
  5163. *
  5164. *   FUNCTION
  5165. *    A new polygon with 4 vertices will be automatically created.
  5166. *    The vertices added to the current object its list and
  5167. *    assigned to the new polygon which will have the 
  5168. *    current material.
  5169. *
  5170. *    A copy of the contents passed by the vector pointers will be made.
  5171. *    The current polygon of the object will be reset, and not set to this one !
  5172. *   INPUTS
  5173. *     spacehandle    - A valid handle of a space.
  5174. *    vertex1        - Pointer to the first veretex.
  5175. *    vertex2        - Pointer to the second vertex.
  5176. *    vertex3        - Pointer to the third vertex.
  5177. *    vertex4        - Pointer to the fourth vertex.
  5178. *    
  5179. *   RESULT
  5180. *     error - ER_NOERROR    if all went well.
  5181. *            ER_NOSPACE    if the handle is not valid.
  5182. *            ER_NOOBJECT   if there is no current object.
  5183. *            ER_NOMATGROUP if there is no current material group.
  5184. *            ER_NOMEMORY   if there is not enough memory. 
  5185. *   EXAMPLE
  5186. *    error = tdQuadAdd4fv(spacehandle,&v1,&v2,&v3,&v4);
  5187. *
  5188. *   NOTES
  5189. *    Vertices have to be added in counterclock wise direction.
  5190. *
  5191. *    v4----v3
  5192. *    |      |
  5193. *    |      |
  5194. *    |      |
  5195. *    |      |
  5196. *    |      |
  5197. *    v1--->v2
  5198. *
  5199. *   BUGS
  5200. *   SEE ALSO
  5201. *     tdTriangleAdd()
  5202. ******************************************************************************
  5203. *
  5204. */
  5205. TDerrors __saveds ASM tdQuadAdd4fv(register __d1 ULONG spacehandle,
  5206.                                     register __a0 TDvectorf *vertex1,
  5207.                                     register __a1 TDvectorf *vertex2,
  5208.                                     register __a2 TDvectorf *vertex3,
  5209.                                     register __a3 TDvectorf *vertex4) {
  5210.  
  5211.     TDspace        *space=NULL;
  5212.     TDpolymesh        *polymesh=NULL;
  5213.     TDmatgroupnode    *matgroupnode=NULL;
  5214.     TDpolygonnode    *polynode=NULL;
  5215.     TDvectord        mvertex1,mvertex2,
  5216.                     mvertex3,mvertex4;
  5217.     ULONG            vindex;
  5218.  
  5219.     // make a copy of vertex1 to 4, a0 and a1 are a scratch registers
  5220.     mvertex1.x=vertex1->x;
  5221.     mvertex1.y=vertex1->y;
  5222.     mvertex1.z=vertex1->z;
  5223.  
  5224.     mvertex2.x=vertex2->x;
  5225.     mvertex2.y=vertex2->y;
  5226.     mvertex2.z=vertex2->z;
  5227.  
  5228.     mvertex3.x=vertex3->x;
  5229.     mvertex3.y=vertex3->y;
  5230.     mvertex3.z=vertex3->z;
  5231.  
  5232.     mvertex4.x=vertex4->x;
  5233.     mvertex4.y=vertex4->y;
  5234.     mvertex4.z=vertex4->z;
  5235.  
  5236.     space=(TDspace *) spacehandle;
  5237.     if (space==NULL) return(ER_NOSPACE);
  5238.  
  5239.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5240.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5241.  
  5242.     polymesh=(TDpolymesh *)(space->curobjn->handle);
  5243.         
  5244.     // get the matgroup, must be present if material is set !
  5245.     matgroupnode=polymesh->curmatgroupn;
  5246.     if(matgroupnode==NULL) return(ER_NOMATGROUP);
  5247.  
  5248.     // Create a new polygon, add it to the internal list
  5249.     if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  5250.  
  5251.     polymesh->curpolyn=NULL;
  5252.  
  5253.     if((vindex=addVertex(polymesh,space->ctm,mvertex1))==0) return(ER_NOMEMORY);
  5254.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5255.     if((vindex=addVertex(polymesh,space->ctm,mvertex2))==0) return(ER_NOMEMORY);
  5256.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5257.     if((vindex=addVertex(polymesh,space->ctm,mvertex3))==0) return(ER_NOMEMORY);
  5258.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5259.     if((vindex=addVertex(polymesh,space->ctm,mvertex4))==0) return(ER_NOMEMORY);
  5260.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5261.  
  5262.     return(ER_NOERROR);
  5263. }
  5264.  
  5265. /****** td.library/tdQuadAdd12da ******************************************
  5266. *   NAME    
  5267. *     tdQuadAdd12da -- Add a new polygon with 4 vertices to the
  5268. *                     current object, this according the CTM.
  5269. *                     The polygon will have the current
  5270. *                     material.
  5271. *
  5272. *   SYNOPSIS
  5273. *    error = tdQuadAdd12da
  5274. *              ( spacehandle,array )
  5275. *                D1           A0
  5276. *
  5277. *    TDerrors tdQuadAdd12da
  5278. *         ( ULONG,TDdouble [12] );
  5279. *
  5280. *   FUNCTION
  5281. *    A new polygon with 4 vertices will be automatically created.
  5282. *    The vertices added to the current object its list and
  5283. *    assigned to the new polygon which will have the 
  5284. *    current material.
  5285. *
  5286. *    A copy of the contents passed by the vector pointers will be made.
  5287. *    The current polygon of the object will be reset, and not set to this one !
  5288. *   INPUTS
  5289. *     spacehandle    - A valid handle of a space.
  5290. *    array          - Array which contains all 12 coordinates.
  5291. *    
  5292. *   RESULT
  5293. *     error - ER_NOERROR    if all went well.
  5294. *            ER_NOSPACE    if the handle is not valid.
  5295. *            ER_NOOBJECT   if there is no current object.
  5296. *            ER_NOMATGROUP if there is no current material group.
  5297. *            ER_NOMEMORY   if there is not enough memory. 
  5298. *   EXAMPLE
  5299. *    error = tdQuadAdd12da(spacehandle,array);
  5300. *
  5301. *   NOTES
  5302. *    Vertices have to be added in counterclock wise direction.
  5303. *
  5304. *    v4----v3
  5305. *    |      |
  5306. *    |      |
  5307. *    |      |
  5308. *    |      |
  5309. *    |      |
  5310. *    v1--->v2
  5311. *
  5312. *   BUGS
  5313. *   SEE ALSO
  5314. *     tdTriangleAdd()
  5315. ******************************************************************************
  5316. *
  5317. */
  5318. TDerrors __saveds ASM tdQuadAdd12da(register __d1 ULONG spacehandle,
  5319.                                     register __a0 TDdouble array[12]) {
  5320.  
  5321.     TDspace        *space=NULL;
  5322.     TDpolymesh        *polymesh=NULL;
  5323.     TDmatgroupnode    *matgroupnode=NULL;
  5324.     TDpolygonnode    *polynode=NULL;
  5325.     TDvectord        mvertex1,mvertex2,
  5326.                     mvertex3,mvertex4;
  5327.     ULONG            vindex;
  5328.  
  5329.     // make a copy of vertex1 to 4, a0 and a1 are a scratch registers
  5330.     mvertex1.x=array[0];
  5331.     mvertex1.y=array[1];
  5332.     mvertex1.z=array[2];
  5333.  
  5334.     mvertex2.x=array[3];
  5335.     mvertex2.y=array[4];
  5336.     mvertex2.z=array[5];
  5337.  
  5338.     mvertex3.x=array[6];
  5339.     mvertex3.y=array[7];
  5340.     mvertex3.z=array[8];
  5341.  
  5342.     mvertex4.x=array[9];
  5343.     mvertex4.y=array[10];
  5344.     mvertex4.z=array[11];
  5345.  
  5346.     space=(TDspace *) spacehandle;
  5347.     if (space==NULL) return(ER_NOSPACE);
  5348.  
  5349.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5350.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5351.  
  5352.     polymesh=(TDpolymesh *)(space->curobjn->handle);
  5353.         
  5354.     // get the matgroup, must be present if material is set !
  5355.     matgroupnode=polymesh->curmatgroupn;
  5356.     if(matgroupnode==NULL) return(ER_NOMATGROUP);
  5357.  
  5358.     // Create a new polygon, add it to the internal list
  5359.     if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  5360.  
  5361.     polymesh->curpolyn=NULL;
  5362.  
  5363.     if((vindex=addVertex(polymesh,space->ctm,mvertex1))==0) return(ER_NOMEMORY);
  5364.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5365.     if((vindex=addVertex(polymesh,space->ctm,mvertex2))==0) return(ER_NOMEMORY);
  5366.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5367.     if((vindex=addVertex(polymesh,space->ctm,mvertex3))==0) return(ER_NOMEMORY);
  5368.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5369.     if((vindex=addVertex(polymesh,space->ctm,mvertex4))==0) return(ER_NOMEMORY);
  5370.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5371.  
  5372.     return(ER_NOERROR);
  5373. }
  5374.  
  5375. /****** td.library/tdQuadAdd12fa ******************************************
  5376. *   NAME    
  5377. *     tdQuadAdd12fa -- Add a new polygon with 4 vertices to the
  5378. *                     current object, this according the CTM.
  5379. *                     The polygon will have the current
  5380. *                     material.
  5381. *
  5382. *   SYNOPSIS
  5383. *    error = tdQuadAdd12fa
  5384. *              ( spacehandle,array )
  5385. *                D1           A0
  5386. *
  5387. *    TDerrors tdQuadAdd12fa
  5388. *         ( ULONG,TDfloat [12] );
  5389. *
  5390. *   FUNCTION
  5391. *    A new polygon with 4 vertices will be automatically created.
  5392. *    The vertices added to the current object its list and
  5393. *    assigned to the new polygon which will have the 
  5394. *    current material.
  5395. *
  5396. *    A copy of the contents passed by the vector pointers will be made.
  5397. *    The current polygon of the object will be reset, and not set to this one !
  5398. *   INPUTS
  5399. *     spacehandle    - A valid handle of a space.
  5400. *    array          - Array which contains all 12 coordinates.
  5401. *    
  5402. *   RESULT
  5403. *     error - ER_NOERROR    if all went well.
  5404. *            ER_NOSPACE    if the handle is not valid.
  5405. *            ER_NOOBJECT   if there is no current object.
  5406. *            ER_NOMATGROUP if there is no current material group.
  5407. *            ER_NOMEMORY   if there is not enough memory. 
  5408. *   EXAMPLE
  5409. *    error = tdQuadAdd12fa(spacehandle,array);
  5410. *
  5411. *   NOTES
  5412. *    Vertices have to be added in counterclock wise direction.
  5413. *
  5414. *    v4----v3
  5415. *    |      |
  5416. *    |      |
  5417. *    |      |
  5418. *    |      |
  5419. *    |      |
  5420. *    v1--->v2
  5421. *
  5422. *   BUGS
  5423. *   SEE ALSO
  5424. *     tdTriangleAdd()
  5425. ******************************************************************************
  5426. *
  5427. */
  5428. TDerrors __saveds ASM tdQuadAdd12fa(register __d1 ULONG spacehandle,
  5429.                                     register __a0 TDfloat array[12]) {
  5430.  
  5431.     TDspace        *space=NULL;
  5432.     TDpolymesh        *polymesh=NULL;
  5433.     TDmatgroupnode    *matgroupnode=NULL;
  5434.     TDpolygonnode    *polynode=NULL;
  5435.     TDvectord        mvertex1,mvertex2,
  5436.                     mvertex3,mvertex4;
  5437.     ULONG            vindex;
  5438.  
  5439.     // make a copy of vertex1 to 4, a0 and a1 are a scratch registers
  5440.     mvertex1.x=array[0];
  5441.     mvertex1.y=array[1];
  5442.     mvertex1.z=array[2];
  5443.  
  5444.     mvertex2.x=array[3];
  5445.     mvertex2.y=array[4];
  5446.     mvertex2.z=array[5];
  5447.  
  5448.     mvertex3.x=array[6];
  5449.     mvertex3.y=array[7];
  5450.     mvertex3.z=array[8];
  5451.  
  5452.     mvertex4.x=array[9];
  5453.     mvertex4.y=array[10];
  5454.     mvertex4.z=array[11];
  5455.  
  5456.     space=(TDspace *) spacehandle;
  5457.     if (space==NULL) return(ER_NOSPACE);
  5458.  
  5459.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5460.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5461.  
  5462.     polymesh=(TDpolymesh *)(space->curobjn->handle);
  5463.         
  5464.     // get the matgroup, must be present if material is set !
  5465.     matgroupnode=polymesh->curmatgroupn;
  5466.     if(matgroupnode==NULL) return(ER_NOMATGROUP);
  5467.  
  5468.     // Create a new polygon, add it to the internal list
  5469.     if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  5470.  
  5471.     polymesh->curpolyn=NULL;
  5472.  
  5473.     if((vindex=addVertex(polymesh,space->ctm,mvertex1))==0) return(ER_NOMEMORY);
  5474.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5475.     if((vindex=addVertex(polymesh,space->ctm,mvertex2))==0) return(ER_NOMEMORY);
  5476.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5477.     if((vindex=addVertex(polymesh,space->ctm,mvertex3))==0) return(ER_NOMEMORY);
  5478.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5479.     if((vindex=addVertex(polymesh,space->ctm,mvertex4))==0) return(ER_NOMEMORY);
  5480.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5481.  
  5482.     return(ER_NOERROR);
  5483. }
  5484.  
  5485. /****** td.library/tdTriangleAdd3dv ******************************************
  5486. *   NAME    
  5487. *     tdTriangleAdd3dv -- Add a new polygon with 3 vertices to the
  5488. *                        current object, this according the CTM.
  5489. *                        The polygon will have the current
  5490. *                        material.
  5491. *
  5492. *   SYNOPSIS
  5493. *    error = tdTriangleAdd3dv
  5494. *              ( spacehandle,vertex1,vertex2,vertex3 )
  5495. *                D1           A0       A1      A2
  5496. *
  5497. *    TDerrors tdTriangleAdd3dv
  5498. *         ( ULONG,TDvectord *,TDvectord *,TDvectord * );
  5499. *
  5500. *   FUNCTION
  5501. *    A new polygon with 3 vertices will be automatically created.
  5502. *    The vertices added to the current object its list and
  5503. *    assigned to the new polygon which will have the 
  5504. *    current material.
  5505. *
  5506. *    A copy of the contents passed by the vector pointers will be made.
  5507. *    The current polygon of the object will be reset, and not set to this one !
  5508. *   INPUTS
  5509. *     spacehandle    - A valid handle of a space.
  5510. *    vertex1        - Pointer to the first veretex.
  5511. *    vertex2        - Pointer to the second vertex.
  5512. *    vertex3        - Pointer to the third vertex.
  5513. *    
  5514. *   RESULT
  5515. *     error - ER_NOERROR    if all went well.
  5516. *            ER_NOSPACE    if the handle is not valid.
  5517. *            ER_NOOBJECT   if there is no current object.
  5518. *            ER_NOMATGROUP if there is no current material group.
  5519. *            ER_NOMEMORY   if there is not enough memory. 
  5520. *   EXAMPLE
  5521. *    error = tdTriangleAdd3dv(spacehandle,&v1,&v2,&v3);
  5522. *
  5523. *   NOTES
  5524. *    Vertices have to be added in counterclock wise direction.
  5525. *
  5526. *          v3
  5527. *         / |
  5528. *        /  |
  5529. *       /   |
  5530. *      /    |
  5531. *     /     |
  5532. *    v1--->v2
  5533. *
  5534. *   BUGS
  5535. *   SEE ALSO
  5536. *     tdQuadAdd()
  5537. ******************************************************************************
  5538. *
  5539. */
  5540. TDerrors __saveds ASM tdTriangleAdd3dv(register __d1 ULONG spacehandle,
  5541.                                         register __a0 TDvectord *vertex1,
  5542.                                         register __a1 TDvectord *vertex2,
  5543.                                         register __a2 TDvectord *vertex3) {
  5544.  
  5545.     TDspace        *space=NULL;
  5546.     TDpolymesh        *polymesh=NULL;
  5547.     TDmatgroupnode    *matgroupnode=NULL;
  5548.     TDpolygonnode    *polynode=NULL;
  5549.     TDvectord        mvertex1,mvertex2,
  5550.                     mvertex3;
  5551.     ULONG            vindex;
  5552.  
  5553.     // make a copy of vertex1 to 3, a0 and a1 are a scratch registers
  5554.     mvertex1=(*vertex1);
  5555.     mvertex2=(*vertex2);
  5556.     mvertex3=(*vertex3);
  5557.  
  5558.     space=(TDspace *) spacehandle;
  5559.     if (space==NULL) return(ER_NOSPACE);
  5560.  
  5561.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5562.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5563.  
  5564.     polymesh=(TDpolymesh *)(space->curobjn->handle);
  5565.         
  5566.     // get the matgroup, must be present if material is set !
  5567.     matgroupnode=polymesh->curmatgroupn;
  5568.     if(matgroupnode==NULL) return(ER_NOMATGROUP);
  5569.  
  5570.     // Create a new polygon, add it to the internal list
  5571.     if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  5572.  
  5573.     polymesh->curpolyn=NULL;
  5574.  
  5575.     if((vindex=addVertex(polymesh,space->ctm,mvertex1))==0) return(ER_NOMEMORY);
  5576.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5577.     if((vindex=addVertex(polymesh,space->ctm,mvertex2))==0) return(ER_NOMEMORY);
  5578.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5579.     if((vindex=addVertex(polymesh,space->ctm,mvertex3))==0) return(ER_NOMEMORY);
  5580.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5581.  
  5582.     return(ER_NOERROR);
  5583. }
  5584.  
  5585. /****** td.library/tdTriangleAdd3fv ******************************************
  5586. *   NAME    
  5587. *     tdTriangleAdd3fv -- Add a new polygon with 3 vertices to the
  5588. *                        current object, this according the CTM.
  5589. *                        The polygon will have the current
  5590. *                        material.
  5591. *
  5592. *   SYNOPSIS
  5593. *    error = tdTriangleAdd3fv
  5594. *              ( spacehandle,vertex1,vertex2,vertex3 )
  5595. *                D1           A0       A1      A2
  5596. *
  5597. *    TDerrors tdTriangleAdd3fv
  5598. *         ( ULONG,TDvectorf *,TDvectorf *,TDvectorf * );
  5599. *
  5600. *   FUNCTION
  5601. *    A new polygon with 3 vertices will be automatically created.
  5602. *    The vertices added to the current object its list and
  5603. *    assigned to the new polygon which will have the 
  5604. *    current material.
  5605. *
  5606. *    A copy of the contents passed by the vector pointers will be made.
  5607. *    The current polygon of the object will be reset, and not set to this one !
  5608. *   INPUTS
  5609. *     spacehandle    - A valid handle of a space.
  5610. *    vertex1        - Pointer to the first veretex.
  5611. *    vertex2        - Pointer to the second vertex.
  5612. *    vertex3        - Pointer to the third vertex.
  5613. *    
  5614. *   RESULT
  5615. *     error - ER_NOERROR    if all went well.
  5616. *            ER_NOSPACE    if the handle is not valid.
  5617. *            ER_NOOBJECT   if there is no current object.
  5618. *            ER_NOMATGROUP if there is no current material group.
  5619. *            ER_NOMEMORY   if there is not enough memory. 
  5620. *   EXAMPLE
  5621. *    error = tdTriangleAdd3fv(spacehandle,&v1,&v2,&v3);
  5622. *
  5623. *   NOTES
  5624. *    Vertices have to be added in counterclock wise direction.
  5625. *
  5626. *          v3
  5627. *         / |
  5628. *        /  |
  5629. *       /   |
  5630. *      /    |
  5631. *     /     |
  5632. *    v1--->v2
  5633. *
  5634. *   BUGS
  5635. *   SEE ALSO
  5636. *     tdQuadAdd()
  5637. ******************************************************************************
  5638. *
  5639. */
  5640. TDerrors __saveds ASM tdTriangleAdd3fv(register __d1 ULONG spacehandle,
  5641.                                         register __a0 TDvectorf *vertex1,
  5642.                                         register __a1 TDvectorf *vertex2,
  5643.                                         register __a2 TDvectorf *vertex3) {
  5644.  
  5645.     TDspace        *space=NULL;
  5646.     TDpolymesh        *polymesh=NULL;
  5647.     TDmatgroupnode    *matgroupnode=NULL;
  5648.     TDpolygonnode    *polynode=NULL;
  5649.     TDvectord        mvertex1,mvertex2,
  5650.                     mvertex3;
  5651.     ULONG            vindex;
  5652.  
  5653.     // make a copy of vertex1 to 3, a0 and a1 are a scratch registers
  5654.     mvertex1.x=vertex1->x;
  5655.     mvertex1.y=vertex1->y;
  5656.     mvertex1.z=vertex1->z;
  5657.  
  5658.     mvertex2.x=vertex2->x;
  5659.     mvertex2.y=vertex2->y;
  5660.     mvertex2.z=vertex2->z;
  5661.  
  5662.     mvertex3.x=vertex3->x;
  5663.     mvertex3.y=vertex3->y;
  5664.     mvertex3.z=vertex3->z;
  5665.  
  5666.     space=(TDspace *) spacehandle;
  5667.     if (space==NULL) return(ER_NOSPACE);
  5668.  
  5669.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5670.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5671.  
  5672.     polymesh=(TDpolymesh *)(space->curobjn->handle);
  5673.         
  5674.     // get the matgroup, must be present if material is set !
  5675.     matgroupnode=polymesh->curmatgroupn;
  5676.     if(matgroupnode==NULL) return(ER_NOMATGROUP);
  5677.  
  5678.     // Create a new polygon, add it to the internal list
  5679.     if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  5680.  
  5681.     polymesh->curpolyn=NULL;
  5682.  
  5683.     if((vindex=addVertex(polymesh,space->ctm,mvertex1))==0) return(ER_NOMEMORY);
  5684.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5685.     if((vindex=addVertex(polymesh,space->ctm,mvertex2))==0) return(ER_NOMEMORY);
  5686.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5687.     if((vindex=addVertex(polymesh,space->ctm,mvertex3))==0) return(ER_NOMEMORY);
  5688.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5689.  
  5690.     return(ER_NOERROR);
  5691. }
  5692.  
  5693. /****** td.library/tdTriangleAdd9da ******************************************
  5694. *   NAME    
  5695. *     tdTriangleAdd9da -- Add a new polygon with 3 vertices to the
  5696. *                        current object, this according the CTM.
  5697. *                        The polygon will have the current
  5698. *                        material.
  5699. *
  5700. *   SYNOPSIS
  5701. *    error = tdTriangleAdd9da
  5702. *              ( spacehandle,array )
  5703. *                D1           A0
  5704. *
  5705. *    TDerrors tdTriangleAdd9da
  5706. *         ( ULONG,TDdouble [9] );
  5707. *
  5708. *   FUNCTION
  5709. *    A new polygon with 3 vertices will be automatically created.
  5710. *    The vertices added to the current object its list and
  5711. *    assigned to the new polygon which will have the 
  5712. *    current material.
  5713. *
  5714. *    A copy of the contents passed by the vector pointers will be made.
  5715. *    The current polygon of the object will be reset, and not set to this one !
  5716. *   INPUTS
  5717. *     spacehandle    - A valid handle of a space.
  5718. *    array          - Array which contains the coordinates.
  5719. *    
  5720. *   RESULT
  5721. *     error - ER_NOERROR    if all went well.
  5722. *            ER_NOSPACE    if the handle is not valid.
  5723. *            ER_NOOBJECT   if there is no current object.
  5724. *            ER_NOMATGROUP if there is no current material group.
  5725. *            ER_NOMEMORY   if there is not enough memory. 
  5726. *   EXAMPLE
  5727. *    error = tdTriangleAdd9da(spacehandle,array);
  5728. *
  5729. *   NOTES
  5730. *    Vertices have to be added in counterclock wise direction.
  5731. *
  5732. *          v3
  5733. *         / |
  5734. *        /  |
  5735. *       /   |
  5736. *      /    |
  5737. *     /     |
  5738. *    v1--->v2
  5739. *
  5740. *   BUGS
  5741. *   SEE ALSO
  5742. *     tdQuadAdd()
  5743. ******************************************************************************
  5744. *
  5745. */
  5746. TDerrors __saveds ASM tdTriangleAdd9da(register __d1 ULONG spacehandle,
  5747.                                         register __a0 TDdouble array[9]) {
  5748.  
  5749.     TDspace        *space=NULL;
  5750.     TDpolymesh        *polymesh=NULL;
  5751.     TDmatgroupnode    *matgroupnode=NULL;
  5752.     TDpolygonnode    *polynode=NULL;
  5753.     TDvectord        mvertex1,mvertex2,
  5754.                     mvertex3;
  5755.     ULONG            vindex;
  5756.  
  5757.     // make a copy of vertex1 to 3, a0 and a1 are a scratch registers
  5758.     mvertex1.x=array[0];
  5759.     mvertex1.y=array[1];
  5760.     mvertex1.z=array[2];
  5761.  
  5762.     mvertex2.x=array[3];
  5763.     mvertex2.y=array[4];
  5764.     mvertex2.z=array[5];
  5765.  
  5766.     mvertex3.x=array[6];
  5767.     mvertex3.y=array[7];
  5768.     mvertex3.z=array[8];
  5769.  
  5770.     space=(TDspace *) spacehandle;
  5771.     if (space==NULL) return(ER_NOSPACE);
  5772.  
  5773.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5774.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5775.  
  5776.     polymesh=(TDpolymesh *)(space->curobjn->handle);
  5777.         
  5778.     // get the matgroup, must be present if material is set !
  5779.     matgroupnode=polymesh->curmatgroupn;
  5780.     if(matgroupnode==NULL) return(ER_NOMATGROUP);
  5781.  
  5782.     // Create a new polygon, add it to the internal list
  5783.     if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  5784.  
  5785.     polymesh->curpolyn=NULL;
  5786.  
  5787.     if((vindex=addVertex(polymesh,space->ctm,mvertex1))==0) return(ER_NOMEMORY);
  5788.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5789.     if((vindex=addVertex(polymesh,space->ctm,mvertex2))==0) return(ER_NOMEMORY);
  5790.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5791.     if((vindex=addVertex(polymesh,space->ctm,mvertex3))==0) return(ER_NOMEMORY);
  5792.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5793.  
  5794.     return(ER_NOERROR);
  5795. }
  5796.  
  5797. /****** td.library/tdTriangleAdd9fa ******************************************
  5798. *   NAME    
  5799. *     tdTriangleAdd9fa -- Add a new polygon with 3 vertices to the
  5800. *                        current object, this according the CTM.
  5801. *                        The polygon will have the current
  5802. *                        material.
  5803. *
  5804. *   SYNOPSIS
  5805. *    error = tdTriangleAdd9fa
  5806. *              ( spacehandle,array )
  5807. *                D1           A0
  5808. *
  5809. *    TDerrors tdTriangleAdd9fa
  5810. *         ( ULONG,TDfloat [9] );
  5811. *
  5812. *   FUNCTION
  5813. *    A new polygon with 3 vertices will be automatically created.
  5814. *    The vertices added to the current object its list and
  5815. *    assigned to the new polygon which will have the 
  5816. *    current material.
  5817. *
  5818. *    A copy of the contents passed by the vector pointers will be made.
  5819. *    The current polygon of the object will be reset, and not set to this one !
  5820. *   INPUTS
  5821. *     spacehandle    - A valid handle of a space.
  5822. *    array          - Array which contains the coordinates.
  5823. *    
  5824. *   RESULT
  5825. *     error - ER_NOERROR    if all went well.
  5826. *            ER_NOSPACE    if the handle is not valid.
  5827. *            ER_NOOBJECT   if there is no current object.
  5828. *            ER_NOMATGROUP if there is no current material group.
  5829. *            ER_NOMEMORY   if there is not enough memory. 
  5830. *   EXAMPLE
  5831. *    error = tdTriangleAdd9fa(spacehandle,array);
  5832. *
  5833. *   NOTES
  5834. *    Vertices have to be added in counterclock wise direction.
  5835. *
  5836. *          v3
  5837. *         / |
  5838. *        /  |
  5839. *       /   |
  5840. *      /    |
  5841. *     /     |
  5842. *    v1--->v2
  5843. *
  5844. *   BUGS
  5845. *   SEE ALSO
  5846. *     tdQuadAdd()
  5847. ******************************************************************************
  5848. *
  5849. */
  5850. TDerrors __saveds ASM tdTriangleAdd9fa(register __d1 ULONG spacehandle,
  5851.                                         register __a0 TDfloat array[9]) {
  5852.  
  5853.     TDspace        *space=NULL;
  5854.     TDpolymesh        *polymesh=NULL;
  5855.     TDmatgroupnode    *matgroupnode=NULL;
  5856.     TDpolygonnode    *polynode=NULL;
  5857.     TDvectord        mvertex1,mvertex2,
  5858.                     mvertex3;
  5859.     ULONG            vindex;
  5860.  
  5861.     // make a copy of vertex1 to 3, a0 and a1 are a scratch registers
  5862.     mvertex1.x=array[0];
  5863.     mvertex1.y=array[1];
  5864.     mvertex1.z=array[2];
  5865.  
  5866.     mvertex2.x=array[3];
  5867.     mvertex2.y=array[4];
  5868.     mvertex2.z=array[5];
  5869.  
  5870.     mvertex3.x=array[6];
  5871.     mvertex3.y=array[7];
  5872.     mvertex3.z=array[8];
  5873.  
  5874.     space=(TDspace *) spacehandle;
  5875.     if (space==NULL) return(ER_NOSPACE);
  5876.  
  5877.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5878.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5879.  
  5880.     polymesh=(TDpolymesh *)(space->curobjn->handle);
  5881.         
  5882.     // get the matgroup, must be present if material is set !
  5883.     matgroupnode=polymesh->curmatgroupn;
  5884.     if(matgroupnode==NULL) return(ER_NOMATGROUP);
  5885.  
  5886.     // Create a new polygon, add it to the internal list
  5887.     if((polynode=addPolygon(polymesh,matgroupnode,Ci_POLYVERARRAYINIT))==NULL) return(ER_NOMEMORY);
  5888.  
  5889.     polymesh->curpolyn=NULL;
  5890.  
  5891.     if((vindex=addVertex(polymesh,space->ctm,mvertex1))==0) return(ER_NOMEMORY);
  5892.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5893.     if((vindex=addVertex(polymesh,space->ctm,mvertex2))==0) return(ER_NOMEMORY);
  5894.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5895.     if((vindex=addVertex(polymesh,space->ctm,mvertex3))==0) return(ER_NOMEMORY);
  5896.     if(assignVertex(polymesh,matgroupnode,polynode,vindex)==0) return(ER_NOMEMORY);
  5897.  
  5898.     return(ER_NOERROR);
  5899. }
  5900.  
  5901. /****** td.library/tdVertexAssign *************************************************
  5902. *   NAME    
  5903. *     tdVertexAssign -- Assigns an existing vertex out of the object its
  5904. *                      vertex list to the current polygon.
  5905. *
  5906. *   SYNOPSIS
  5907. *    error = tdVertexAssign( spacehandle,index )
  5908. *                              D1        D2
  5909. *
  5910. *    TDerrors tdVertexAssign
  5911. *         ( ULONG,ULONG );
  5912. *
  5913. *   FUNCTION
  5914. *    An existing vertex, added with a tdVertexAdd or similar function
  5915. *    before to the object, can be assigned to the current polygon.
  5916. *   INPUTS
  5917. *     spacehandle  - A valid handle of a space.
  5918. *    index        - The index of the vertex in the object its list.
  5919. *    
  5920. *   RESULT
  5921. *     error - ER_NOERROR    if all went well.
  5922. *            ER_NOSPACE    if the handle is not valid.
  5923. *            ER_NOOBJECT   if there is no current object.
  5924. *            ER_NOPOLYGON  if there is no current polygon.
  5925. *            ER_NOINDEX    if the index is not valid.
  5926. *            ER_NOMEMORY   if there is not enough memory. 
  5927. *   EXAMPLE
  5928. *    error = tdVertexAssign(spacehandle,97);
  5929. *
  5930. *   NOTES
  5931. *    Vertices have to be assigned in counterclock wise direction.
  5932. *
  5933. *          v3
  5934. *         / |
  5935. *        /  |
  5936. *       /   |
  5937. *      /    |
  5938. *     /     |
  5939. *    v1--->v2
  5940. *
  5941. *   BUGS
  5942. *   SEE ALSO
  5943. *     tdVertexAdd(),tdVertexGet(),
  5944. *    tdVertexIndexGet()
  5945. ******************************************************************************
  5946. *
  5947. */
  5948. TDerrors __saveds ASM tdVertexAssign(register __d1 ULONG spacehandle,
  5949.                                     register __d2 ULONG index) {
  5950.  
  5951.     TDspace        *space=NULL;
  5952.     TDpolymesh        *mesh=NULL;
  5953.  
  5954.     space=(TDspace *) spacehandle;
  5955.     if (space==NULL) return(ER_NOSPACE);
  5956.  
  5957.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  5958.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  5959.  
  5960.     mesh=(TDpolymesh *)(space->curobjn->handle);
  5961.  
  5962.     if(mesh->vertices.numberOfVertices<1 || 
  5963.         index<1 || index>mesh->vertices.numberOfVertices) {
  5964.  
  5965.         return(ER_NOINDEX);
  5966.     }
  5967.  
  5968.     if(mesh->curpolyn!=NULL) {
  5969.         if(assignVertex(mesh,mesh->curmatgroupn,mesh->curpolyn,index)==0) return(ER_NOMEMORY);
  5970.     } else {
  5971.         return(ER_NOPOLYGON);
  5972.     }
  5973.  
  5974.     return(ER_NOERROR);
  5975. }
  5976.  
  5977. /****** td.library/tdVertexIndexGet *************************************************
  5978. *   NAME    
  5979. *     tdVertexIndexGet -- Converts the index of a vertex in the current
  5980. *                        polygon to the index in the object its vertex list.
  5981. *
  5982. *   SYNOPSIS
  5983. *    error = tdVertexIndexGet( spacehandle,pindex,index )
  5984. *                              D1          D2     D3
  5985. *
  5986. *    TDerrors tdVertexIndexGet
  5987. *         ( ULONG,ULONG,ULONG * );
  5988. *
  5989. *   FUNCTION
  5990. *    Vertices in polygons are references to the vertices found
  5991. *    in the vertex list of the parent object. To get the index
  5992. *    of a vertex in the object with the help of the index in the
  5993. *    current polygon just call this function.
  5994. *   INPUTS
  5995. *     spacehandle  - A valid handle of a space.
  5996. *    pindex       - The index of the vertex in the polygon.
  5997. *    index        - Pointer to the variable which will contain
  5998. *                   the index of the object list.
  5999. *    
  6000. *   RESULT
  6001. *     error - ER_NOERROR    if all went well.
  6002. *            ER_NOSPACE    if the handle is not valid.
  6003. *            ER_NOOBJECT   if there is no current object.
  6004. *            ER_NOPOLYGON  if there is no current polygon.
  6005. *            ER_NOINDEX    if the index is not valid.
  6006. *   EXAMPLE
  6007. *    error = tdVertexIndexGet(spacehandle,97,&index);
  6008. *
  6009. *   NOTES
  6010. *
  6011. *   BUGS
  6012. *   SEE ALSO
  6013. *     tdVertexAdd(),tdVertexGet(),
  6014. *    tdVertexAssign()
  6015. ******************************************************************************
  6016. *
  6017. */
  6018. TDerrors __saveds ASM tdVertexIndexGet(register __d1 ULONG spacehandle,
  6019.                                     register __d2 ULONG pindex,
  6020.                                     register __d3 ULONG *index) {
  6021.  
  6022.     TDspace        *space=NULL;
  6023.     TDpolymesh        *mesh=NULL;
  6024.     TDpolygonnode    *polynode=NULL;
  6025.  
  6026.     space=(TDspace *) spacehandle;
  6027.     if (space==NULL) return(ER_NOSPACE);
  6028.  
  6029.     if(space->curobjn==NULL) return(ER_NOOBJECT);
  6030.     if(space->curobjn->type!=TD_POLYMESH) return(ER_NOOBJECT);
  6031.  
  6032.     mesh=(TDpolymesh *)(space->curobjn->handle);
  6033.  
  6034.     polynode=mesh->curpolyn;
  6035.     if(polynode==NULL) {
  6036.         return(ER_NOPOLYGON);
  6037.     }
  6038.  
  6039.     if(polynode->numberOfVertices<1 || 
  6040.         pindex<1 || pindex>polynode->numberOfVertices) {
  6041.  
  6042.         return(ER_NOINDEX);
  6043.     }
  6044.  
  6045.     (*index)=mesh->curpolyn->varray[pindex-1];
  6046.  
  6047.     return(ER_NOERROR);
  6048. }
  6049.  
  6050. /****** td.library/tdChildSetl ******************************************
  6051. *   NAME    
  6052. *     tdChildSetl -- Set a parameter of the current child.
  6053. *   SYNOPSIS
  6054. *    error = tdChildSetl( spacehandle,type,value )
  6055. *                         D1          D2   D3
  6056. *
  6057. *    TDerrors tdChildSetl
  6058. *         ( ULONG,TDenum,ULONG );
  6059. *
  6060. *   FUNCTION
  6061. *    The parameter of the current child, will be changed.
  6062. *    Type specifies which parameter.
  6063. *   INPUTS
  6064. *     spacehandle     - A valid handle of a space.
  6065. *    type            - The parameter its type.
  6066. *    value           - The new value of the parameter.
  6067. *    
  6068. *   RESULT
  6069. *     error - ER_NOERROR    if all went well.
  6070. *            ER_NOSPACE    if the handle is not valid.
  6071. *            ER_NOOBJECT   if there is no current object.
  6072. *            ER_NOMATGROUP if there is no current material group.
  6073. *            ER_NOVALUE    if the value is incorrect.
  6074. *            ER_NOTYPE     if the type is not valid.
  6075. *
  6076. *   EXAMPLE
  6077. *    error = tdChildSetl(spacehandle,TD_TEXBINDING,36);
  6078. *
  6079. *   NOTES
  6080. *
  6081. *   BUGS
  6082. *   SEE ALSO
  6083. *     tdChildGet(),tdCurrentSet()
  6084. ******************************************************************************
  6085. *
  6086. */
  6087. TDerrors __saveds ASM tdChildSetl(register __d1 ULONG spacehandle,
  6088.                                     register __d2 TDenum type,
  6089.                                     register __d3 ULONG value) {
  6090.     TDspace        *space=NULL;
  6091.     TDobjectnode    *object=NULL;
  6092.     TDobjectnode    *object2=NULL;
  6093.     TDpolymesh        *polymesh=NULL;
  6094.     TDmatgroupnode    *matgroupn=NULL;
  6095.     TDmaterialnode    *matnode=NULL;
  6096.  
  6097.     space=(TDspace *) spacehandle;
  6098.     if (space==NULL) return(ER_NOSPACE);
  6099.  
  6100.     // set the value of the current child in function of the type
  6101.     switch(type) {
  6102.         case TD_MATERIAL :
  6103.             object=space->curobjn;
  6104.             if(object==NULL) return(ER_NOOBJECT);
  6105.  
  6106.             switch(object->type) {
  6107.                 case TD_POLYMESH :
  6108.                     polymesh=(TDpolymesh *)object->handle;
  6109.  
  6110.                     matgroupn=polymesh->curmatgroupn;
  6111.                     if(matgroupn==NULL) return(ER_NOMATGROUP);
  6112.  
  6113.                     if((matnode=getMaterialNode(space,value))==NULL) return(ER_NOVALUE);
  6114.                     if(matnode->type==TD_TEXTURE) return(ER_NOVALUE);
  6115.  
  6116.                     matgroupn->materialnode=matnode;
  6117.  
  6118.                     break;
  6119.             }
  6120.  
  6121.             break;
  6122.         case TD_TEXBINDING :
  6123.             object=space->curobjn;
  6124.             if(object==NULL) return(ER_NOOBJECT);
  6125.  
  6126.             switch(object->type) {
  6127.                 case TD_POLYMESH :
  6128.                     polymesh=(TDpolymesh *)object->handle;
  6129.  
  6130.                     matgroupn=polymesh->curmatgroupn;
  6131.                     if(matgroupn==NULL) return(ER_NOMATGROUP);
  6132.  
  6133.                     if((object2=getObjectNode(space,value))==NULL) return(ER_NOVALUE);
  6134.                     if(object2->type!=TD_TEXBINDING) return(ER_NOVALUE);
  6135.  
  6136.                     matgroupn->texbindex=value;
  6137.  
  6138.                     break;
  6139.             }
  6140.  
  6141.             break;
  6142.         default :
  6143.             return(ER_NOTYPE);
  6144.     }
  6145.  
  6146.     return(ER_NOERROR);
  6147. }
  6148.  
  6149. /****** td.library/tdChildGetl ******************************************
  6150. *   NAME    
  6151. *     tdChildGetl -- Get a parameter of the current child.
  6152. *   SYNOPSIS
  6153. *    error = tdChildGetl( spacehandle,type,value )
  6154. *                         D1          D2   D3
  6155. *
  6156. *    TDerrors tdChildGetl
  6157. *         ( ULONG,TDenum,ULONG * );
  6158. *
  6159. *   FUNCTION
  6160. *    The parameter of the current child, will be returned.
  6161. *    Type specifies which parameter.
  6162. *   INPUTS
  6163. *     spacehandle     - A valid handle of a space.
  6164. *    type            - The parameter its type.
  6165. *    value           - The variable which will contain the parameter.
  6166. *    
  6167. *   RESULT
  6168. *     error - ER_NOERROR    if all went well.
  6169. *            ER_NOSPACE    if the handle is not valid.
  6170. *            ER_NOOBJECT   if there is no current object.
  6171. *            ER_NOMATGROUP if there is no current material group.
  6172. *            ER_NOVALUE    if the value is not set.
  6173. *            ER_NOTYPE     if the type is not valid.
  6174. *
  6175. *   EXAMPLE
  6176. *    error = tdChildGetl(spacehandle,TD_SURFACE,&value);
  6177. *
  6178. *   NOTES
  6179. *
  6180. *   BUGS
  6181. *   SEE ALSO
  6182. *     tdChildSet(),tdCurrentSet()
  6183. ******************************************************************************
  6184. *
  6185. */
  6186. TDerrors __saveds ASM tdChildGetl(register __d1 ULONG spacehandle,
  6187.                                     register __d2 TDenum type,
  6188.                                     register __d3 ULONG *value) {
  6189.     TDspace        *space=NULL;
  6190.     TDobjectnode    *object=NULL;
  6191.     TDpolymesh        *polymesh=NULL;
  6192.     TDmatgroupnode    *matgroupn=NULL;
  6193.  
  6194.     (*value)=0;
  6195.  
  6196.     space=(TDspace *) spacehandle;
  6197.     if (space==NULL) return(ER_NOSPACE);
  6198.  
  6199.     // get the value of the current child in function of the type
  6200.     switch(type) {
  6201.         case TD_MATERIAL :
  6202.             object=space->curobjn;
  6203.             if(object==NULL) return(ER_NOOBJECT);
  6204.  
  6205.             switch(object->type) {
  6206.                 case TD_POLYMESH :
  6207.                     polymesh=(TDpolymesh *)object->handle;
  6208.  
  6209.                     matgroupn=polymesh->curmatgroupn;
  6210.                     if(matgroupn==NULL) return(ER_NOMATGROUP);
  6211.  
  6212.                     (*value)=matgroupn->materialnode->index;
  6213.  
  6214.                     if((*value)==0) return(ER_NOVALUE);
  6215.  
  6216.                     break;
  6217.             }
  6218.  
  6219.             break;
  6220.         case TD_TEXBINDING :
  6221.             object=space->curobjn;
  6222.             if(object==NULL) return(ER_NOOBJECT);
  6223.  
  6224.             switch(object->type) {
  6225.                 case TD_POLYMESH :
  6226.                     polymesh=(TDpolymesh *)object->handle;
  6227.  
  6228.                     matgroupn=polymesh->curmatgroupn;
  6229.                     if(matgroupn==NULL) return(ER_NOMATGROUP);
  6230.  
  6231.                     (*value)=matgroupn->texbindex;
  6232.  
  6233.                     if((*value)==0) return(ER_NOVALUE);
  6234.  
  6235.                     break;
  6236.             }
  6237.         default :
  6238.             return(ER_NOTYPE);
  6239.     }
  6240.  
  6241.     return(ER_NOERROR);
  6242. }
  6243.  
  6244. /****** td.library/tdXNofGet ******************************************
  6245. *   NAME    
  6246. *     tdXNofGet -- Returns the number of extensions of a
  6247. *                 spedific type.
  6248. *   SYNOPSIS
  6249. *    number = tdXNofGet(type)
  6250. *                       D1
  6251. *
  6252. *    ULONG tdXNofGet
  6253. *         ( TDEnum );
  6254. *
  6255. *   FUNCTION
  6256. *    You will get the number of extensions in 
  6257. *    function of type.
  6258. *   INPUTS
  6259. *    type - Type of extension.
  6260. *    
  6261. *   RESULT
  6262. *     number - Number of extensions.
  6263. *
  6264. *   EXAMPLE
  6265. *    number = tdXNofGet(TD_3X);
  6266. *
  6267. *   NOTES
  6268. *
  6269. *   BUGS
  6270. *   SEE ALSO
  6271. *     tdXNameGet(),tdXExtGet(),tdXSupportedGet(),tdXDescGet(),
  6272. *    tdXLibGet()
  6273. ******************************************************************************
  6274. *
  6275. */
  6276. ULONG __saveds ASM tdXNofGet(register __d1 TDenum type) {
  6277.     TDenum mtype;
  6278.     ULONG i,j;
  6279.  
  6280.     // make a copy of type, d1 is a scratch register
  6281.     mtype=type;
  6282.  
  6283.     switch(mtype) {
  6284.         case TD_3X :
  6285.             if(tdlibinfos->lib3dinfos!=NULL) {
  6286.                 i=0;
  6287.                 while(tdlibinfos->lib3dinfos[i]!=NULL) i++;
  6288.                 return(i);
  6289.             }
  6290.             break;
  6291.         case TD_3XSAVE :
  6292.             if(tdlibinfos->lib3dinfos!=NULL) {
  6293.                 j=0;
  6294.                 i=0;
  6295.                 while(tdlibinfos->lib3dinfos[i]!=NULL) {
  6296.                     if(tdlibinfos->lib3dinfos[i]->sups!=NULL) j++;
  6297.                     i++;
  6298.                 }
  6299.                 return(j);
  6300.             }
  6301.             break;
  6302.         case TD_3XLOAD :
  6303.             if(tdlibinfos->lib3dinfos!=NULL) {
  6304.                 j=0;
  6305.                 i=0;
  6306.                 while(tdlibinfos->lib3dinfos[i]!=NULL) {
  6307.                     if(tdlibinfos->lib3dinfos[i]->supl!=NULL) j++;
  6308.                     i++;
  6309.                 }
  6310.                 return(j);
  6311.             }
  6312.             break;
  6313.     }
  6314.  
  6315.     return(0);
  6316. }
  6317.  
  6318. /****** td.library/tdXExtGet ******************************************
  6319. *   NAME    
  6320. *     tdXExtGet -- Returns the file extension of a specific
  6321. *                 extension.
  6322. *   SYNOPSIS
  6323. *    extension = tdXExtGet(type,name)
  6324. *                          D1   D2
  6325. *
  6326. *    STRPTR tdXExtGet
  6327. *         ( TDEnum,STRPTR );
  6328. *
  6329. *   FUNCTION
  6330. *    You will get the file extension of the extension
  6331. *    with its name and type.
  6332. *
  6333. *    This strings are READ_ONLY and only valid as
  6334. *    long as the library is opened.
  6335. *   INPUTS
  6336. *    type - Type of extension.
  6337. *    name - Name of the extension.
  6338. *    
  6339. *   RESULT
  6340. *     extension - Name of the extension, or NULL if none.
  6341. *
  6342. *   EXAMPLE
  6343. *    extension = tdXExtGet(TD_3X,"VRML");
  6344. *
  6345. *   NOTES
  6346. *
  6347. *   BUGS
  6348. *   SEE ALSO
  6349. *     tdXNameGet(),tdXNofGet(),tdXSupportedGet(),tdXDescGet(),
  6350. *    tdXLibGet()
  6351. ******************************************************************************
  6352. *
  6353. */
  6354. STRPTR __saveds ASM tdXExtGet(register __d1 TDenum type,register __d2 STRPTR name) {
  6355.     TDenum mtype;
  6356.     ULONG i;
  6357.  
  6358.     // make a copy of type, d1 is a scratch register
  6359.     mtype=type;
  6360.  
  6361.     switch(mtype) {
  6362.         case TD_3X :
  6363.         case TD_3XSAVE :
  6364.         case TD_3XLOAD :
  6365.             if(tdlibinfos->lib3dinfos!=NULL && name!=NULL) {
  6366.                 i=0;
  6367.                 while(tdlibinfos->lib3dinfos[i]!=NULL) {
  6368.                     if(strcmp(tdlibinfos->lib3dinfos[i]->name,name)==0) {
  6369.                         return(tdlibinfos->lib3dinfos[i]->ext);
  6370.                     }
  6371.                     i++;
  6372.                 }
  6373.             }
  6374.             break;
  6375.     }
  6376.  
  6377.     return(NULL);
  6378. }
  6379.  
  6380. /****** td.library/tdXNameGet ******************************************
  6381. *   NAME    
  6382. *     tdXNameGet -- Returns the name of an extension.
  6383. *   SYNOPSIS
  6384. *    name = tdXNameGet(type,index)
  6385. *                      D1   D2
  6386. *
  6387. *    STRPTR tdXNameGet
  6388. *         ( TDEnum,ULONG );
  6389. *
  6390. *   FUNCTION
  6391. *    You will get the name of an extension module by
  6392. *    specifying its type and the index of it.
  6393. *
  6394. *    This strings are READ_ONLY and only valid as
  6395. *    long as the library is opened.
  6396. *   INPUTS
  6397. *    type     - Type of extension.
  6398. *    index    - Index of the extension.
  6399. *               0 -> tdXNofGet()-1
  6400. *    
  6401. *   RESULT
  6402. *     name - Name of NULL if none.
  6403. *
  6404. *   EXAMPLE
  6405. *    name = tdXNameGet(TD_3XSAVE,4);
  6406. *
  6407. *   NOTES
  6408. *    When you get NULL for a correct infex and type,
  6409. *    this means that the extension does not at all
  6410. *    support this type of function.
  6411. *
  6412. *   BUGS
  6413. *   SEE ALSO
  6414. *     tdXExtGet(),tdXNofGet(),tdXSupportedGet(),tdXGescGet(),
  6415. *    tdXLibGet()
  6416. ******************************************************************************
  6417. *
  6418. */
  6419. STRPTR __saveds ASM tdXNameGet(register __d1 TDenum type,register __d2 ULONG index) {
  6420.     TDenum mtype;
  6421.  
  6422.     // make a copy of type, d1 is a scratch register
  6423.     mtype=type;
  6424.  
  6425.     switch(mtype) {
  6426.         case TD_3XSAVE :
  6427.             if(tdlibinfos->lib3dinfos!=NULL) {
  6428.                 if(index>=0 && index<tdXNofGet(TD_3X)) {
  6429.                     if(tdlibinfos->lib3dinfos[index]->sups!=NULL) {
  6430.                         return(tdlibinfos->lib3dinfos[index]->name);
  6431.                     }
  6432.                 }
  6433.             }
  6434.             break;
  6435.         case TD_3XLOAD :
  6436.             if(tdlibinfos->lib3dinfos!=NULL) {
  6437.                 if(index>=0 && index<tdXNofGet(TD_3X)) {
  6438.                     if(tdlibinfos->lib3dinfos[index]->supl!=NULL) {
  6439.                         return(tdlibinfos->lib3dinfos[index]->name);
  6440.                     }
  6441.                 }
  6442.             }
  6443.             break;
  6444.         case TD_3X :
  6445.             if(tdlibinfos->lib3dinfos!=NULL) {
  6446.                 if(index>=0 && index<tdXNofGet(TD_3X)) {
  6447.                     return(tdlibinfos->lib3dinfos[index]->name);
  6448.                 }
  6449.             }
  6450.             break;
  6451.     }
  6452.     return(NULL);
  6453. }
  6454.  
  6455. /****** td.library/tdXSupportedGet ******************************************
  6456. *   NAME    
  6457. *     tdXSupportedGet -- Returns an array of supported functions
  6458. *                       for a specific extension.
  6459. *   SYNOPSIS
  6460. *    array = tdXSupportedGet(type,name)
  6461. *                            D1   D2
  6462. *
  6463. *    TDenum * tdXSupportedGet
  6464. *         ( TDEnum,STRPTR );
  6465. *
  6466. *   FUNCTION
  6467. *    You will get an array of all supported functions of the
  6468. *    extension.
  6469. *
  6470. *    This lists are READ_ONLY and only valid as
  6471. *    long as the library is opened.
  6472. *   INPUTS
  6473. *    type     - Type of extension.
  6474. *    name     - Name of the extension.
  6475. *    
  6476. *   RESULT
  6477. *     array - A list of functions, terminated with TD_NOTHING,
  6478. *            or NULL if none.
  6479. *
  6480. *   EXAMPLE
  6481. *    array = tdXSupportedGet(TD_3XSAVE,"VRML");
  6482. *
  6483. *   NOTES
  6484. *
  6485. *   BUGS
  6486. *   SEE ALSO
  6487. *     tdXExtGet(),tdXNofGet(),tdXNameGet(),tdXDescGet(),
  6488. *    tdXLibGet()
  6489. ******************************************************************************
  6490. *
  6491. */
  6492. TDenum * __saveds ASM tdXSupportedGet(register __d1 TDenum type,register __d2 STRPTR name) {
  6493.     TDenum mtype;
  6494.     ULONG i;
  6495.  
  6496.     // make a copy of type, d1 is a scratch register
  6497.     mtype=type;
  6498.  
  6499.     switch(mtype) {
  6500.         case TD_3XSAVE :
  6501.         case TD_3XLOAD :
  6502.             if(tdlibinfos->lib3dinfos!=NULL && name!=NULL) {
  6503.                 i=0;
  6504.                 while(tdlibinfos->lib3dinfos[i]!=NULL) {
  6505.                     if(strcmp(tdlibinfos->lib3dinfos[i]->name,name)==0) {
  6506.                         if(mtype==TD_3XSAVE) {
  6507.                             return(tdlibinfos->lib3dinfos[i]->sups);
  6508.                         } else {
  6509.                             return(tdlibinfos->lib3dinfos[i]->supl);
  6510.                         }
  6511.                     }
  6512.                     i++;
  6513.                 }
  6514.             }
  6515.             break;
  6516.     }
  6517.     return(NULL);
  6518. }
  6519.  
  6520. /****** td.library/tdXDescGet ******************************************
  6521. *   NAME    
  6522. *     tdXDescGet -- Returns a description for the type.
  6523. *   SYNOPSIS
  6524. *    description = tdXDescGet(type)
  6525. *                             D1
  6526. *
  6527. *    STRPTR tdXDescGet
  6528. *         ( TDEnum );
  6529. *
  6530. *   FUNCTION
  6531. *    You will get a short description for the specific type.
  6532. *
  6533. *    This strings are READ_ONLY and only valid as
  6534. *    long as the library is opened.
  6535. *   INPUTS
  6536. *    type     - Type of which you want a description.
  6537. *    
  6538. *   RESULT
  6539. *     description - A short description of type, or NULL if none.
  6540. *
  6541. *   EXAMPLE
  6542. *    description = tdXDescGet(TD_OJBECT);
  6543. *
  6544. *   NOTES
  6545. *
  6546. *   BUGS
  6547. *   SEE ALSO
  6548. *     tdXExtGet(),tdXNofGet(),txXNameGet(),tdXSupportedGet(),
  6549. *    tdXLibGet()
  6550. ******************************************************************************
  6551. *
  6552. */
  6553. STRPTR __saveds ASM tdXDescGet(register __d1 TDenum type) {
  6554.     TDenum mtype;
  6555.  
  6556.     // make a copy of type, d1 is a scratch register
  6557.     mtype=type;
  6558.  
  6559.     switch(mtype) {
  6560.         case TD_SPACE :
  6561.             return("Space");
  6562.         case TD_OBJECT :
  6563.             return("Object");
  6564.         case TD_MATERIAL :
  6565.             return("Material");
  6566.         case TD_SURFACE :
  6567.             return("Surface");
  6568.         case TD_TEXTURE :
  6569.             return("Texture");
  6570.     }
  6571.  
  6572.     return(NULL);
  6573. }
  6574.  
  6575. /****** td.library/tdXLibGet ******************************************
  6576. *   NAME    
  6577. *     tdXLibGet -- Returns the name of the extension library.
  6578. *   SYNOPSIS
  6579. *    library = tdXLibGet(type,name)
  6580. *                        D1   D2
  6581. *
  6582. *    STRPTR tdXLibGet
  6583. *         ( TDEnum,STRPTR );
  6584. *
  6585. *   FUNCTION
  6586. *    You will get the name of the extension library
  6587. *    with its name and type.
  6588. *
  6589. *    This strings are READ_ONLY and only valid as
  6590. *    long as the library is opened.
  6591. *   INPUTS
  6592. *    type - Type of extension.
  6593. *    name - Name of the extension.
  6594. *    
  6595. *   RESULT
  6596. *     library - Name of the library, or NULL if none.
  6597. *
  6598. *   EXAMPLE
  6599. *    library = tdXLibGet(TD_3X,"VRML");
  6600. *
  6601. *   NOTES
  6602. *
  6603. *   BUGS
  6604. *   SEE ALSO
  6605. *     tdXNameGet(),tdXNofGet(),tdXSupportedGet(),tdXDescGet(),
  6606. *    tdXExtGet()
  6607. ******************************************************************************
  6608. *
  6609. */
  6610. STRPTR __saveds ASM tdXLibGet(register __d1 TDenum type,register __d2 STRPTR name) {
  6611.     TDenum mtype;
  6612.     ULONG i;
  6613.  
  6614.     // make a copy of type, d1 is a scratch register
  6615.     mtype=type;
  6616.  
  6617.     switch(mtype) {
  6618.         case TD_3X :
  6619.         case TD_3XSAVE :
  6620.         case TD_3XLOAD :
  6621.             if(tdlibinfos->lib3dinfos!=NULL && name!=NULL) {
  6622.                 i=0;
  6623.                 while(tdlibinfos->lib3dinfos[i]!=NULL) {
  6624.                     if(strcmp(tdlibinfos->lib3dinfos[i]->name,name)==0) {
  6625.                         return(tdlibinfos->lib3dinfos[i]->library);
  6626.                     }
  6627.                     i++;
  6628.                 }
  6629.             }
  6630.             break;
  6631.     }
  6632.  
  6633.     return(NULL);
  6634. }
  6635.  
  6636.  
  6637.  
  6638.  
  6639.  
  6640.  
  6641.  
  6642.  
  6643.  
  6644.  
  6645.  
  6646.  
  6647.  
  6648.  
  6649.  
  6650.  
  6651.  
  6652.  
  6653.  
  6654.  
  6655.  
  6656.  
  6657.  
  6658.  
  6659.  
  6660.  
  6661.  
  6662.  
  6663.  
  6664.  
  6665.  
  6666.  
  6667.  
  6668.  
  6669.  
  6670.  
  6671.  
  6672.  
  6673.  
  6674.  
  6675.  
  6676.  
  6677.  
  6678.  
  6679.  
  6680.  
  6681.  
  6682.  
  6683.  
  6684.  
  6685.  
  6686.  
  6687.  
  6688.  
  6689.  
  6690.  
  6691.  
  6692.  
  6693.  
  6694.  
  6695.  
  6696.  
  6697.  
  6698.  
  6699.  
  6700.  
  6701.  
  6702.  
  6703.  
  6704.  
  6705.  
  6706.  
  6707.  
  6708.  
  6709.  
  6710.  
  6711.  
  6712.  
  6713.  
  6714.  
  6715.  
  6716.  
  6717.  
  6718.  
  6719.  
  6720.  
  6721.  
  6722.  
  6723.  
  6724.  
  6725.  
  6726.  
  6727.  
  6728.  
  6729.  
  6730.  
  6731.  
  6732.  
  6733.  
  6734.  
  6735.  
  6736.  
  6737.  
  6738.  
  6739.  
  6740.  
  6741.  
  6742.  
  6743.  
  6744.  
  6745.  
  6746.  
  6747.  
  6748.  
  6749.  
  6750.  
  6751.  
  6752.  
  6753.  
  6754. /****** tdo.library/meshCameraLightDefaultSet ******************************************
  6755. *   NAME    
  6756. *     meshCameraLightDefaultSet -- Set the camera and light to defaults.
  6757. *   SYNOPSIS
  6758. *    error = meshCameraLightDefaultSet( meshhandle )
  6759. *                                       D1
  6760. *
  6761. *    ULONG meshCameraLightDefaultSet
  6762. *         ( ULONG )
  6763. *
  6764. *   FUNCTION
  6765. *    This function sets the camera and light properties as follows :
  6766. *    Camera looks to the center of the mesh and is positioned to view the whole mesh.
  6767. *    Light is positioned at the same point than the camera and gets a white color.
  6768. *   INPUTS
  6769. *     meshhandle      - A valid handle of a mesh.
  6770. *    
  6771. *   RESULT
  6772. *     error - RCER_NOERROR    if all went well.
  6773. *            RCNOMESH     if the handle is not valid.
  6774. *
  6775. *   EXAMPLE
  6776. *    error= meshCameraLightDefaultSet(meshhandle);
  6777. *
  6778. *   NOTES
  6779. *    Camera and light will be used by some file formats only,
  6780. *    and for 2D or display functions.
  6781. *
  6782. *    If no values are set, this function will be called internally before
  6783. *    using functions which need a camera or a light source.
  6784. *
  6785. *   BUGS
  6786. *   SEE ALSO
  6787. *     meshCameraPositionSet(),meshCameraLookAtSet(),
  6788. *    meshLightPositionSet(),meshLightColorSet()
  6789. ******************************************************************************
  6790. *
  6791. */
  6792. ULONG __saveds ASM meshCameraLightDefaultSet(register __d1 ULONG meshhandle) {
  6793.     TTDOMesh *mesh=NULL;
  6794.   
  6795.     mesh=(TTDOMesh *) meshhandle;
  6796.     if(mesh==NULL) return(RCNOMESH);
  6797.     
  6798.     setCameraLight(mesh);
  6799.     
  6800.     return(RCNOERROR);
  6801. }
  6802.  
  6803. /****** tdo.library/meshCameraPositionSetdv ******************************************
  6804. *   NAME    
  6805. *     meshCameraPositionSetdv -- Set the camera position.
  6806. *   SYNOPSIS
  6807. *    error = meshCameraPositionSetdv( meshhandle,position )
  6808. *                                     D1          A0
  6809. *
  6810. *    ULONG meshCameraPositionSetdv
  6811. *         ( ULONG,TTDOVertexd * );
  6812. *
  6813. *   FUNCTION
  6814. *    The position of the camera will be set to the values passed by the
  6815. *    vertex structure.
  6816. *   INPUTS
  6817. *     meshhandle      - A valid handle of a mesh.
  6818. *    position        - Pointer to a vertex structure containing the position information.
  6819. *    
  6820. *   RESULT
  6821. *     error - RCNOERROR    if all went well.
  6822. *`            RCNOMESH     if the handle is not valid.
  6823. *
  6824. *   EXAMPLE
  6825. *    error = meshCameraPositionSetdv(meshhandle,&myvertex);
  6826. *
  6827. *   NOTES
  6828. *    The camera will be used by some file formats only,
  6829. *    and for 2D or display functions.
  6830. *
  6831. *   BUGS
  6832. *   SEE ALSO
  6833. *     meshCameraPositionGet(),meshCameraLookAtSet(),
  6834. *    meshCameraLookAtGet()
  6835. ******************************************************************************
  6836. *
  6837. */
  6838. ULONG __saveds ASM meshCameraPositionSetdv(register __d1 ULONG meshhandle,
  6839.                                             register __a0 TTDOVertexd *position) {
  6840.     TTDOMesh        *mesh=NULL;
  6841.     TTDOVertexd    *mposition=NULL;
  6842.     
  6843.     // make a copy of position, a0 is a scratch register
  6844.     mposition=position;
  6845.   
  6846.     mesh=(TTDOMesh *) meshhandle;
  6847.     if(mesh==NULL) return(RCNOMESH);
  6848.     
  6849.     mesh->camera.position=(*mposition);
  6850.     
  6851.     return(RCNOERROR);
  6852. }
  6853.  
  6854. /****** tdo.library/meshCameraPositionSetfv ******************************************
  6855. *   NAME    
  6856. *     meshCameraPositionSetfv -- Set the camera position.
  6857. *   SYNOPSIS
  6858. *    error = meshCameraPositionSetfv( meshhandle,position )
  6859. *                                     D1          A0
  6860. *
  6861. *    ULONG meshCameraPositionSetfv
  6862. *         ( ULONG,TTDOVertexf * );
  6863. *
  6864. *   FUNCTION
  6865. *    The position of the camera will be set to the values passed by the
  6866. *    vertex structure.
  6867. *   INPUTS
  6868. *     meshhandle      - A valid handle of a mesh.
  6869. *    position        - Pointer to a vertex structure containing the position information.
  6870. *    
  6871. *   RESULT
  6872. *     error - RCNOERROR    if all went well.
  6873. *`            RCNOMESH     if the handle is not valid.
  6874. *
  6875. *   EXAMPLE
  6876. *    error = meshCameraPositionSetfv(meshhandle,&myvertex);
  6877. *
  6878. *   NOTES
  6879. *    The camera will be used by some file formats only,
  6880. *    and for 2D or display functions.
  6881. *
  6882. *   BUGS
  6883. *   SEE ALSO
  6884. *     meshCameraPositionGet(),meshCameraLookAtSet(),
  6885. *    meshCameraLookAtGet()
  6886. ******************************************************************************
  6887. *
  6888. */
  6889. ULONG __saveds ASM meshCameraPositionSetfv(register __d1 ULONG meshhandle,
  6890.                                             register __a0 TTDOVertexf *position) {
  6891.     TTDOMesh        *mesh=NULL;
  6892.     TTDOVertexd    mposition;
  6893.     
  6894.     // make a copy of position, a0 is a scratch register
  6895.     mposition.x=position->x;
  6896.     mposition.y=position->y;
  6897.     mposition.z=position->z;
  6898.   
  6899.     mesh=(TTDOMesh *) meshhandle;
  6900.     if(mesh==NULL) return(RCNOMESH);
  6901.     
  6902.     mesh->camera.position=mposition;
  6903.     
  6904.     return(RCNOERROR);
  6905. }
  6906.  
  6907. /****** tdo.library/meshCameraPositionSet3da ******************************************
  6908. *   NAME    
  6909. *     meshCameraPositionSet3da -- Set the camera position.
  6910. *   SYNOPSIS
  6911. *    error = meshCameraPositionSet3da( meshhandle,position )
  6912. *                                      D1          A0
  6913. *
  6914. *    ULONG meshCameraPositionSet3da
  6915. *         ( ULONG,TTDODouble [3] );
  6916. *
  6917. *   FUNCTION
  6918. *    The position of the camera will be set to the values passed by the
  6919. *    double array.
  6920. *   INPUTS
  6921. *     meshhandle      - A valid handle of a mesh.
  6922. *    position        - A double array containing the position information.
  6923. *    
  6924. *   RESULT
  6925. *     error - RCNOERROR    if all went well.
  6926. *`            RCNOMESH     if the handle is not valid.
  6927. *
  6928. *   EXAMPLE
  6929. *    error = meshCameraPositionSet3da(meshhandle,myvertex);
  6930. *
  6931. *   NOTES
  6932. *    The camera will be used by some file formats only,
  6933. *    and for 2D or display functions.
  6934. *
  6935. *   BUGS
  6936. *   SEE ALSO
  6937. *     meshCameraPositionGet(),meshCameraLookAtSet(),
  6938. *    meshCameraLookAtGet()
  6939. ******************************************************************************
  6940. *
  6941. */
  6942. ULONG __saveds ASM meshCameraPositionSet3da(register __d1 ULONG meshhandle,
  6943.                                             register __a0 TTDODouble position[3]) {
  6944.     TTDOMesh        *mesh=NULL;
  6945.     TTDOVertexd    mposition;
  6946.     
  6947.     // make a copy of position, a0 is a scratch register
  6948.     mposition.x=position[0];
  6949.     mposition.y=position[1];
  6950.     mposition.z=position[2];
  6951.   
  6952.     mesh=(TTDOMesh *) meshhandle;
  6953.     if(mesh==NULL) return(RCNOMESH);
  6954.     
  6955.     mesh->camera.position=mposition;
  6956.     
  6957.     return(RCNOERROR);
  6958. }
  6959.  
  6960. /****** tdo.library/meshCameraPositionSet3fa ******************************************
  6961. *   NAME    
  6962. *     meshCameraPositionSet3fa -- Set the camera position.
  6963. *   SYNOPSIS
  6964. *    error = meshCameraPositionSet3fa( meshhandle,position )
  6965. *                                      D1          A0
  6966. *
  6967. *    ULONG meshCameraPositionSet3fa
  6968. *         ( ULONG,TTDOFloat [3] );
  6969. *
  6970. *   FUNCTION
  6971. *    The position of the camera will be set to the values passed by the
  6972. *    float array.
  6973. *   INPUTS
  6974. *     meshhandle      - A valid handle of a mesh.
  6975. *    position        - A float array containing the position information.
  6976. *    
  6977. *   RESULT
  6978. *     error - RCNOERROR    if all went well.
  6979. *`            RCNOMESH     if the handle is not valid.
  6980. *
  6981. *   EXAMPLE
  6982. *    error = meshCameraPositionSet3fa(meshhandle,myvertex);
  6983. *
  6984. *   NOTES
  6985. *    The camera will be used by some file formats only,
  6986. *    and for 2D or display functions.
  6987. *
  6988. *   BUGS
  6989. *   SEE ALSO
  6990. *     meshCameraPositionGet(),meshCameraLookAtSet(),
  6991. *    meshCameraLookAtGet()
  6992. ******************************************************************************
  6993. *
  6994. */
  6995. ULONG __saveds ASM meshCameraPositionSet3fa(register __d1 ULONG meshhandle,
  6996.                                             register __a0 TTDOFloat position[3]) {
  6997.     TTDOMesh        *mesh=NULL;
  6998.     TTDOVertexd    mposition;
  6999.     
  7000.     // make a copy of position, a0 is a scratch register
  7001.     mposition.x=position[0];
  7002.     mposition.y=position[1];
  7003.     mposition.z=position[2];
  7004.   
  7005.     mesh=(TTDOMesh *) meshhandle;
  7006.     if(mesh==NULL) return(RCNOMESH);
  7007.     
  7008.     mesh->camera.position=mposition;
  7009.     
  7010.     return(RCNOERROR);
  7011. }
  7012.  
  7013. /****** tdo.library/meshCameraPositionGetdv ******************************************
  7014. *   NAME    
  7015. *     meshCameraPositionGetdv -- Get the position of the camera.
  7016. *   SYNOPSIS
  7017. *    error = meshCameraPositionGetdv( meshhandle,position )
  7018. *                                     D1          A0
  7019. *
  7020. *    ULONG meshCameraPositionGetdv
  7021. *         ( ULONG,TTDOVertexd * );
  7022. *
  7023. *   FUNCTION
  7024. *    The position of the camera will be written in the passed vertex structure.
  7025. *   INPUTS
  7026. *     meshhandle      - A valid handle of a mesh.
  7027. *    position        - Pointer to a vertex structure which will contain
  7028. *                      the position information.
  7029. *    
  7030. *   RESULT
  7031. *     error - RCNOERROR    if all went well.
  7032. *            RCNOMESH     if the handle is not valid.
  7033. *
  7034. *   EXAMPLE
  7035. *    error = meshCameraPositionGetdv(meshhandle,&myvertex);
  7036. *
  7037. *   NOTES
  7038. *    The camera will be used by some file formats only,
  7039. *    and for 2D or display functions.
  7040. *
  7041. *   BUGS
  7042. *   SEE ALSO
  7043. *     meshCameraPositionSet(),meshCameraLookAtSet()
  7044. *    meshCameraLookAtGet()
  7045. ******************************************************************************
  7046. *
  7047. */
  7048. ULONG __saveds ASM meshCameraPositionGetdv(register __d1 ULONG meshhandle,
  7049.                                             register __a0 TTDOVertexd *position) {
  7050.     TTDOMesh        *mesh=NULL;
  7051.     TTDOVertexd    *mposition=NULL;
  7052.     
  7053.     // make a copy of position, a0 is a scratch register
  7054.     mposition=position;
  7055.  
  7056.     mesh = (TTDOMesh *) meshhandle;
  7057.     if(mesh==NULL) return(RCNOMESH);
  7058.  
  7059.     (*mposition)=mesh->camera.position;
  7060.     
  7061.     return(RCNOERROR);
  7062. }
  7063.  
  7064. /****** tdo.library/meshCameraPositionGetfv ******************************************
  7065. *   NAME    
  7066. *     meshCameraPositionGetfv -- Get the position of the camera.
  7067. *   SYNOPSIS
  7068. *    error = meshCameraPositionGetfv( meshhandle,position )
  7069. *                                     D1          A0
  7070. *
  7071. *    ULONG meshCameraPositionGetfv
  7072. *         ( ULONG,TTDOVertexf * );
  7073. *
  7074. *   FUNCTION
  7075. *    The position of the camera will be written in the passed vertex structure.
  7076. *   INPUTS
  7077. *     meshhandle      - A valid handle of a mesh.
  7078. *    position        - Pointer to a vertex structure which will contain
  7079. *                      the position information.
  7080. *    
  7081. *   RESULT
  7082. *     error - RCNOERROR    if all went well.
  7083. *            RCNOMESH     if the handle is not valid.
  7084. *
  7085. *   EXAMPLE
  7086. *    error = meshCameraPositionGetfv(meshhandle,&myvertex);
  7087. *
  7088. *   NOTES
  7089. *    The camera will be used by some file formats only,
  7090. *    and for 2D or display functions.
  7091. *
  7092. *   BUGS
  7093. *   SEE ALSO
  7094. *     meshCameraPositionSet(),meshCameraLookAtSet()
  7095. *    meshCameraLookAtGet()
  7096. ******************************************************************************
  7097. *
  7098. */
  7099. ULONG __saveds ASM meshCameraPositionGetfv(register __d1 ULONG meshhandle,
  7100.                                             register __a0 TTDOVertexf *position) {
  7101.     TTDOMesh        *mesh=NULL;
  7102.     TTDOVertexf    *mposition=NULL;
  7103.     
  7104.     // make a copy of position, a0 is a scratch register
  7105.     mposition=position;
  7106.  
  7107.     mesh = (TTDOMesh *) meshhandle;
  7108.     if(mesh==NULL) return(RCNOMESH);
  7109.  
  7110.     mposition->x=mesh->camera.position.x;
  7111.     mposition->y=mesh->camera.position.y;
  7112.     mposition->z=mesh->camera.position.z;
  7113.     
  7114.     return(RCNOERROR);
  7115. }
  7116.  
  7117. /****** tdo.library/meshCameraPositionGet3da ******************************************
  7118. *   NAME    
  7119. *     meshCameraPositionGet3da -- Get the position of the camera.
  7120. *   SYNOPSIS
  7121. *    error = meshCameraPositionGet3da( meshhandle,position )
  7122. *                                      D1          A0
  7123. *
  7124. *    ULONG meshCameraPositionGet3da
  7125. *         ( ULONG,TTDODouble [3] );
  7126. *
  7127. *   FUNCTION
  7128. *    The position of the camera will be written in the passed double array.
  7129. *   INPUTS
  7130. *     meshhandle      - A valid handle of a mesh.
  7131. *    position        - A double array which will contain
  7132. *                      the position information.
  7133. *    
  7134. *   RESULT
  7135. *     error - RCNOERROR    if all went well.
  7136. *            RCNOMESH     if the handle is not valid.
  7137. *
  7138. *   EXAMPLE
  7139. *    error = meshCameraPositionGet3da(meshhandle,myvertex);
  7140. *
  7141. *   NOTES
  7142. *    The camera will be used by some file formats only,
  7143. *    and for 2D or display functions.
  7144. *
  7145. *   BUGS
  7146. *   SEE ALSO
  7147. *     meshCameraPositionSet(),meshCameraLookAtSet()
  7148. *    meshCameraLookAtGet()
  7149. ******************************************************************************
  7150. *
  7151. */
  7152. ULONG __saveds ASM meshCameraPositionGet3da(register __d1 ULONG meshhandle,
  7153.                                             register __a0 TTDODouble position[3]) {
  7154.     TTDOMesh        *mesh=NULL;
  7155.     TTDODouble        *mposition=NULL;
  7156.     
  7157.     // make a copy of position, a0 is a scratch register
  7158.     mposition=position;
  7159.  
  7160.     mesh = (TTDOMesh *) meshhandle;
  7161.     if(mesh==NULL) return(RCNOMESH);
  7162.  
  7163.     mposition[0]=mesh->camera.position.x;
  7164.     mposition[1]=mesh->camera.position.y;
  7165.     mposition[2]=mesh->camera.position.z;
  7166.     
  7167.     return(RCNOERROR);
  7168. }
  7169.  
  7170. /****** tdo.library/meshCameraPositionGet3fa ******************************************
  7171. *   NAME    
  7172. *     meshCameraPositionGet3fa -- Get the position of the camera.
  7173. *   SYNOPSIS
  7174. *    error = meshCameraPositionGet3fa( meshhandle,position )
  7175. *                                      D1          A0
  7176. *
  7177. *    ULONG meshCameraPositionGet3fa
  7178. *         ( ULONG,TTDOFloat [3] );
  7179. *
  7180. *   FUNCTION
  7181. *    The position of the camera will be written in the passed float array.
  7182. *   INPUTS
  7183. *     meshhandle      - A valid handle of a mesh.
  7184. *    position        - A float array which will contain
  7185. *                      the position information.
  7186. *    
  7187. *   RESULT
  7188. *     error - RCNOERROR    if all went well.
  7189. *            RCNOMESH     if the handle is not valid.
  7190. *
  7191. *   EXAMPLE
  7192. *    error = meshCameraPositionGet3fa(meshhandle,myvertex);
  7193. *
  7194. *   NOTES
  7195. *    The camera will be used by some file formats only,
  7196. *    and for 2D or display functions.
  7197. *
  7198. *   BUGS
  7199. *   SEE ALSO
  7200. *     meshCameraPositionSet(),meshCameraLookAtSet()
  7201. *    meshCameraLookAtGet()
  7202. ******************************************************************************
  7203. *
  7204. */
  7205. ULONG __saveds ASM meshCameraPositionGet3fa(register __d1 ULONG meshhandle,
  7206.                                             register __a0 TTDOFloat position[3]) {
  7207.     TTDOMesh        *mesh=NULL;
  7208.     TTDOFloat        *mposition=NULL;
  7209.     
  7210.     // make a copy of position, a0 is a scratch register
  7211.     mposition=position;
  7212.  
  7213.     mesh = (TTDOMesh *) meshhandle;
  7214.     if(mesh==NULL) return(RCNOMESH);
  7215.  
  7216.     mposition[0]=mesh->camera.position.x;
  7217.     mposition[1]=mesh->camera.position.y;
  7218.     mposition[2]=mesh->camera.position.z;
  7219.     
  7220.     return(RCNOERROR);
  7221. }
  7222.  
  7223. /****** tdo.library/meshCameraLookAtSetdv ******************************************
  7224. *   NAME    
  7225. *     meshCameraLookAtSetdv -- Set the camera its view point.
  7226. *   SYNOPSIS
  7227. *    error = meshCameraLookAtSetdv( meshhandle,lookat )
  7228. *                                   D1          A0
  7229. *
  7230. *    ULONG meshCameraLookAtSetdv
  7231. *         ( ULONG,TTDOVertexd * );
  7232. *
  7233. *   FUNCTION
  7234. *    The view point of the camera will be set to the values passed by the
  7235. *    vertex structure.
  7236. *   INPUTS
  7237. *     meshhandle      - A valid handle of a mesh.
  7238. *    lookat          - Pointer to a vertex structure containing the position information.
  7239. *    
  7240. *   RESULT
  7241. *     error - RCNOERROR    if all went well.
  7242. *            RCNOMESH     if the handle is not valid.
  7243. *
  7244. *   EXAMPLE
  7245. *    error = meshCameraLookAtSetdv(meshhandle,&myvertex);
  7246. *
  7247. *   NOTES
  7248. *    The camera will be used by some file formats only,
  7249. *    and for 2D or display functions.
  7250. *
  7251. *   BUGS
  7252. *   SEE ALSO
  7253. *     meshCameraLookAtGet(),meshCameraPositionSet()
  7254. *    meshCameraPositionSet()
  7255. ******************************************************************************
  7256. *
  7257. */
  7258. ULONG __saveds ASM meshCameraLookAtSetdv(register __d1 ULONG meshhandle,
  7259.                                         register __a0 TTDOVertexd *lookat) {
  7260.     TTDOMesh        *mesh=NULL;
  7261.     TTDOVertexd    *mlookat=NULL;
  7262.  
  7263.     // make a copy of lookat, a0 is a scratch register
  7264.     mlookat=lookat;
  7265.  
  7266.     mesh=(TTDOMesh *) meshhandle;
  7267.     if(mesh==NULL) return(RCNOMESH);
  7268.     
  7269.     mesh->camera.lookat=(*mlookat);
  7270.     
  7271.     return(RCNOERROR);
  7272. }
  7273.  
  7274. /****** tdo.library/meshCameraLookAtSetfv ******************************************
  7275. *   NAME    
  7276. *     meshCameraLookAtSetfv -- Set the camera its view point.
  7277. *   SYNOPSIS
  7278. *    error = meshCameraLookAtSetfv( meshhandle,lookat )
  7279. *                                   D1          A0
  7280. *
  7281. *    ULONG meshCameraLookAtSetfv
  7282. *         ( ULONG,TTDOVertexf * );
  7283. *
  7284. *   FUNCTION
  7285. *    The view point of the camera will be set to the values passed by the
  7286. *    vertex structure.
  7287. *   INPUTS
  7288. *     meshhandle      - A valid handle of a mesh.
  7289. *    lookat          - Pointer to a vertex structure containing the position information.
  7290. *    
  7291. *   RESULT
  7292. *     error - RCNOERROR    if all went well.
  7293. *            RCNOMESH     if the handle is not valid.
  7294. *
  7295. *   EXAMPLE
  7296. *    error = meshCameraLookAtSetfv(meshhandle,&myvertex);
  7297. *
  7298. *   NOTES
  7299. *    The camera will be used by some file formats only,
  7300. *    and for 2D or display functions.
  7301. *
  7302. *   BUGS
  7303. *   SEE ALSO
  7304. *     meshCameraLookAtGet(),meshCameraPositionSet()
  7305. *    meshCameraPositionSet()
  7306. ******************************************************************************
  7307. *
  7308. */
  7309. ULONG __saveds ASM meshCameraLookAtSetfv(register __d1 ULONG meshhandle,
  7310.                                         register __a0 TTDOVertexf *lookat) {
  7311.     TTDOMesh        *mesh=NULL;
  7312.     TTDOVertexf    *mlookat=NULL;
  7313.  
  7314.     // make a copy of lookat, a0 is a scratch register
  7315.     mlookat=lookat;
  7316.  
  7317.     mesh=(TTDOMesh *) meshhandle;
  7318.     if(mesh==NULL) return(RCNOMESH);
  7319.     
  7320.     mesh->camera.lookat.x=mlookat->x;
  7321.     mesh->camera.lookat.y=mlookat->y;
  7322.     mesh->camera.lookat.z=mlookat->z;
  7323.     
  7324.     return(RCNOERROR);
  7325. }
  7326.  
  7327. /****** tdo.library/meshCameraLookAtSet3da ******************************************
  7328. *   NAME    
  7329. *     meshCameraLookAtSet3da -- Set the camera its view point.
  7330. *   SYNOPSIS
  7331. *    error = meshCameraLookAtSet3da( meshhandle,lookat )
  7332. *                                    D1          A0
  7333. *
  7334. *    ULONG meshCameraLookAtSet3da
  7335. *         ( ULONG,TTDODouble [3] );
  7336. *
  7337. *   FUNCTION
  7338. *    The view point of the camera will be set to the values passed by the
  7339. *    double array.
  7340. *   INPUTS
  7341. *     meshhandle      - A valid handle of a mesh.
  7342. *    lookat          - A double array which contains the position information.
  7343. *    
  7344. *   RESULT
  7345. *     error - RCNOERROR    if all went well.
  7346. *            RCNOMESH     if the handle is not valid.
  7347. *
  7348. *   EXAMPLE
  7349. *    error = meshCameraLookAtSet3da(meshhandle,myvertex);
  7350. *
  7351. *   NOTES
  7352. *    The camera will be used by some file formats only,
  7353. *    and for 2D or display functions.
  7354. *
  7355. *   BUGS
  7356. *   SEE ALSO
  7357. *     meshCameraLookAtGet(),meshCameraPositionSet()
  7358. *    meshCameraPositionSet()
  7359. ******************************************************************************
  7360. *
  7361. */
  7362. ULONG __saveds ASM meshCameraLookAtSet3da(register __d1 ULONG meshhandle,
  7363.                                             register __a0 TTDODouble lookat[3]) {
  7364.     TTDOMesh        *mesh=NULL;
  7365.     TTDODouble        *mlookat=NULL;
  7366.  
  7367.     // make a copy of lookat, a0 is a scratch register
  7368.     mlookat=lookat;
  7369.  
  7370.     mesh=(TTDOMesh *) meshhandle;
  7371.     if(mesh==NULL) return(RCNOMESH);
  7372.     
  7373.     mesh->camera.lookat.x=mlookat[0];
  7374.     mesh->camera.lookat.y=mlookat[1];
  7375.     mesh->camera.lookat.z=mlookat[2];
  7376.     
  7377.     return(RCNOERROR);
  7378. }
  7379.  
  7380. /****** tdo.library/meshCameraLookAtSet3fa ******************************************
  7381. *   NAME    
  7382. *     meshCameraLookAtSet3fa -- Set the camera its view point.
  7383. *   SYNOPSIS
  7384. *    error = meshCameraLookAtSet3fa( meshhandle,lookat )
  7385. *                                    D1          A0
  7386. *
  7387. *    ULONG meshCameraLookAtSet3fa
  7388. *         ( ULONG,TTDOFloat [3] );
  7389. *
  7390. *   FUNCTION
  7391. *    The view point of the camera will be set to the values passed by the
  7392. *    float array.
  7393. *   INPUTS
  7394. *     meshhandle      - A valid handle of a mesh.
  7395. *    lookat          - A float array which contains the position information.
  7396. *    
  7397. *   RESULT
  7398. *     error - RCNOERROR    if all went well.
  7399. *            RCNOMESH     if the handle is not valid.
  7400. *
  7401. *   EXAMPLE
  7402. *    error = meshCameraLookAtSet3fa(meshhandle,myvertex);
  7403. *
  7404. *   NOTES
  7405. *    The camera will be used by some file formats only,
  7406. *    and for 2D or display functions.
  7407. *
  7408. *   BUGS
  7409. *   SEE ALSO
  7410. *     meshCameraLookAtGet(),meshCameraPositionSet()
  7411. *    meshCameraPositionSet()
  7412. ******************************************************************************
  7413. *
  7414. */
  7415. ULONG __saveds ASM meshCameraLookAtSet3fa(register __d1 ULONG meshhandle,
  7416.                                             register __a0 TTDOFloat lookat[3]) {
  7417.     TTDOMesh        *mesh=NULL;
  7418.     TTDOFloat        *mlookat=NULL;
  7419.  
  7420.     // make a copy of lookat, a0 is a scratch register
  7421.     mlookat=lookat;
  7422.  
  7423.     mesh=(TTDOMesh *) meshhandle;
  7424.     if(mesh==NULL) return(RCNOMESH);
  7425.     
  7426.     mesh->camera.lookat.x=mlookat[0];
  7427.     mesh->camera.lookat.y=mlookat[1];
  7428.     mesh->camera.lookat.z=mlookat[2];
  7429.     
  7430.     return(RCNOERROR);
  7431. }
  7432.  
  7433. /****** tdo.library/meshCameraLookAtGetdv ******************************************
  7434. *   NAME    
  7435. *     meshCameraLookAtGetdv -- Get the view point of the camera.
  7436. *   SYNOPSIS
  7437. *    error = meshCameraLookAtGetdv( meshhandle,lookat )
  7438. *                                   D1          A0
  7439. *
  7440. *    ULONG meshCameraLookAtGetdv
  7441. *         ( ULONG,TTDOVertexd * );
  7442. *
  7443. *   FUNCTION
  7444. *    The view point of the camera will be written in the passed vertex structure.
  7445. *   INPUTS
  7446. *     meshhandle      - A valid handle of a mesh.
  7447. *    lookat          - Pointer to a vertex structure which will contain
  7448. *                      the position information.
  7449. *    
  7450. *   RESULT
  7451. *     error - RCNOERROR    if all went well.
  7452. *            RCNOMESH     if the handle is not valid.
  7453. *
  7454. *   EXAMPLE
  7455. *    error = meshCameraLookAtGetdv(meshhandle,&myvertex);
  7456. *
  7457. *   NOTES
  7458. *    The camera will be used by some file formats only,
  7459. *    and for 2D or display functions.
  7460. *
  7461. *   BUGS
  7462. *   SEE ALSO
  7463. *     meshCameraLookAtSet(),meshCameraPositionSet()
  7464. *    meshCameraPositionGet()
  7465. ******************************************************************************
  7466. *
  7467. */
  7468. ULONG __saveds ASM meshCameraLookAtGetdv(register __d1 ULONG meshhandle,
  7469.                                         register __a0 TTDOVertexd *lookat) {
  7470.     TTDOMesh        *mesh=NULL;
  7471.     TTDOVertexd    *mlookat=NULL;
  7472.     
  7473.     // make a copy of lookat, a0 is a scratch register
  7474.     mlookat=lookat;
  7475.   
  7476.     mesh=(TTDOMesh *) meshhandle;
  7477.     if(mesh==NULL) return(RCNOMESH);
  7478.  
  7479.     (*mlookat)=mesh->camera.lookat;
  7480.     
  7481.     return(RCNOERROR);
  7482. }
  7483.  
  7484. /****** tdo.library/meshCameraLookAtGetfv ******************************************
  7485. *   NAME    
  7486. *     meshCameraLookAtGetfv -- Get the view point of the camera.
  7487. *   SYNOPSIS
  7488. *    error = meshCameraLookAtGetfv( meshhandle,lookat )
  7489. *                                   D1          A0
  7490. *
  7491. *    ULONG meshCameraLookAtGetfv
  7492. *         ( ULONG,TTDOVertexf * );
  7493. *
  7494. *   FUNCTION
  7495. *    The view point of the camera will be written in the passed vertex structure.
  7496. *   INPUTS
  7497. *     meshhandle      - A valid handle of a mesh.
  7498. *    lookat          - Pointer to a vertex structure which will contain
  7499. *                      the position information.
  7500. *    
  7501. *   RESULT
  7502. *     error - RCNOERROR    if all went well.
  7503. *            RCNOMESH     if the handle is not valid.
  7504. *
  7505. *   EXAMPLE
  7506. *    error = meshCameraLookAtGetfv(meshhandle,&myvertex);
  7507. *
  7508. *   NOTES
  7509. *    The camera will be used by some file formats only,
  7510. *    and for 2D or display functions.
  7511. *
  7512. *   BUGS
  7513. *   SEE ALSO
  7514. *     meshCameraLookAtSet(),meshCameraPositionSet()
  7515. *    meshCameraPositionGet()
  7516. ******************************************************************************
  7517. *
  7518. */
  7519. ULONG __saveds ASM meshCameraLookAtGetfv(register __d1 ULONG meshhandle,
  7520.                                             register __a0 TTDOVertexf *lookat) {
  7521.     TTDOMesh        *mesh=NULL;
  7522.     TTDOVertexf    *mlookat=NULL;
  7523.     
  7524.     // make a copy of lookat, a0 is a scratch register
  7525.     mlookat=lookat;
  7526.   
  7527.     mesh=(TTDOMesh *) meshhandle;
  7528.     if(mesh==NULL) return(RCNOMESH);
  7529.  
  7530.     mlookat->x=mesh->camera.lookat.x;
  7531.     mlookat->y=mesh->camera.lookat.y;
  7532.     mlookat->z=mesh->camera.lookat.z;
  7533.     
  7534.     return(RCNOERROR);
  7535. }
  7536.  
  7537. /****** tdo.library/meshCameraLookAtGet3da ******************************************
  7538. *   NAME    
  7539. *     meshCameraLookAtGet3da -- Get the view point of the camera.
  7540. *   SYNOPSIS
  7541. *    error = meshCameraLookAtGet3da( meshhandle,lookat )
  7542. *                                    D1          A0
  7543. *
  7544. *    ULONG meshCameraLookAtGet3da
  7545. *         ( ULONG,TTDODouble [3] );
  7546. *
  7547. *   FUNCTION
  7548. *    The view point of the camera will be written in the passed double array.
  7549. *   INPUTS
  7550. *     meshhandle      - A valid handle of a mesh.
  7551. *    lookat          - A double array which will contain
  7552. *                      the position information.
  7553. *    
  7554. *   RESULT
  7555. *     error - RCNOERROR    if all went well.
  7556. *            RCNOMESH     if the handle is not valid.
  7557. *
  7558. *   EXAMPLE
  7559. *    error = meshCameraLookAtGet3da(meshhandle,myvertex);
  7560. *
  7561. *   NOTES
  7562. *    The camera will be used by some file formats only,
  7563. *    and for 2D or display functions.
  7564. *
  7565. *   BUGS
  7566. *   SEE ALSO
  7567. *     meshCameraLookAtSet(),meshCameraPositionSet()
  7568. *    meshCameraPositionGet()
  7569. ******************************************************************************
  7570. *
  7571. */
  7572. ULONG __saveds ASM meshCameraLookAtGet3da(register __d1 ULONG meshhandle,
  7573.                                             register __a0 TTDODouble lookat[3]) {
  7574.     TTDOMesh        *mesh=NULL;
  7575.     TTDODouble        *mlookat=NULL;
  7576.     
  7577.     // make a copy of lookat, a0 is a scratch register
  7578.     mlookat=lookat;
  7579.   
  7580.     mesh=(TTDOMesh *) meshhandle;
  7581.     if(mesh==NULL) return(RCNOMESH);
  7582.  
  7583.     mlookat[0]=mesh->camera.lookat.x;
  7584.     mlookat[1]=mesh->camera.lookat.y;
  7585.     mlookat[2]=mesh->camera.lookat.z;
  7586.     
  7587.     return(RCNOERROR);
  7588. }
  7589.  
  7590. /****** tdo.library/meshCameraLookAtGet3fa ******************************************
  7591. *   NAME    
  7592. *     meshCameraLookAtGet3fa -- Get the view point of the camera.
  7593. *   SYNOPSIS
  7594. *    error = meshCameraLookAtGet3fa( meshhandle,lookat )
  7595. *                                    D1          A0
  7596. *
  7597. *    ULONG meshCameraLookAtGet3fa
  7598. *         ( ULONG,TTDOFloat [3] );
  7599. *
  7600. *   FUNCTION
  7601. *    The view point of the camera will be written in the passed float array.
  7602. *   INPUTS
  7603. *     meshhandle      - A valid handle of a mesh.
  7604. *    lookat          - A float array which will contain
  7605. *                      the position information.
  7606. *    
  7607. *   RESULT
  7608. *     error - RCNOERROR    if all went well.
  7609. *            RCNOMESH     if the handle is not valid.
  7610. *
  7611. *   EXAMPLE
  7612. *    error = meshCameraLookAtGet3fa(meshhandle,myvertex);
  7613. *
  7614. *   NOTES
  7615. *    The camera will be used by some file formats only,
  7616. *    and for 2D or display functions.
  7617. *
  7618. *   BUGS
  7619. *   SEE ALSO
  7620. *     meshCameraLookAtSet(),meshCameraPositionSet()
  7621. *    meshCameraPositionGet()
  7622. ******************************************************************************
  7623. *
  7624. */
  7625. ULONG __saveds ASM meshCameraLookAtGet3fa(register __d1 ULONG meshhandle,
  7626.                                             register __a0 TTDOFloat lookat[3]) {
  7627.     TTDOMesh        *mesh=NULL;
  7628.     TTDOFloat        *mlookat=NULL;
  7629.     
  7630.     // make a copy of lookat, a0 is a scratch register
  7631.     mlookat=lookat;
  7632.   
  7633.     mesh=(TTDOMesh *) meshhandle;
  7634.     if(mesh==NULL) return(RCNOMESH);
  7635.  
  7636.     mlookat[0]=mesh->camera.lookat.x;
  7637.     mlookat[1]=mesh->camera.lookat.y;
  7638.     mlookat[2]=mesh->camera.lookat.z;
  7639.     
  7640.     return(RCNOERROR);
  7641. }
  7642.  
  7643. /****** tdo.library/meshLightPositionSetdv ******************************************
  7644. *   NAME    
  7645. *     meshLightPositionSetdv -- Set the light source its position.
  7646. *   SYNOPSIS
  7647. *    error = meshLightPositionSetdv( meshhandle,position )
  7648. *                                    D1          A0
  7649. *
  7650. *    ULONG meshLightPositionSetdv
  7651. *         ( ULONG,TTDOVertexd * );
  7652. *
  7653. *   FUNCTION
  7654. *    The position of the light source will be set to the values passed by the
  7655. *    vertex structure.
  7656. *   INPUTS
  7657. *     meshhandle      - A valid handle of a mesh.
  7658. *    position        - Pointer to a vertex structure containing the position information.
  7659. *    
  7660. *   RESULT
  7661. *     error - RCNOERROR    if all went well.
  7662. *            RCNOMESH     if the handle is not valid.
  7663. *
  7664. *   EXAMPLE
  7665. *    error = meshLightPositionSetdv(meshhandle,&myvertex);
  7666. *
  7667. *   NOTES
  7668. *    The light will be used by some file formats only,
  7669. *    and for 2D or display functions.
  7670. *
  7671. *   BUGS
  7672. *   SEE ALSO
  7673. *     meshLightPositionGet(),meshLightColorSet()
  7674. *    meshLightColorGet()
  7675. ******************************************************************************
  7676. *
  7677. */
  7678. ULONG __saveds ASM meshLightPositionSetdv(register __d1 ULONG meshhandle,
  7679.                                             register __a0 TTDOVertexd *position) {
  7680.     TTDOMesh        *mesh=NULL;
  7681.     TTDOVertexd        *mposition=NULL;
  7682.  
  7683.     // make a copy of position, a0 is a scratch register
  7684.     mposition=position;
  7685.  
  7686.     mesh=(TTDOMesh *) meshhandle;
  7687.     if(mesh==NULL) return(RCNOMESH);
  7688.     
  7689.     mesh->light.position=(*mposition);
  7690.     
  7691.     return(RCNOERROR);
  7692. }
  7693.  
  7694. /****** tdo.library/meshLightPositionSetfv ******************************************
  7695. *   NAME    
  7696. *     meshLightPositionSetfv -- Set the light source its position.
  7697. *   SYNOPSIS
  7698. *    error = meshLightPositionSetfv( meshhandle,position )
  7699. *                                    D1          A0
  7700. *
  7701. *    ULONG meshLightPositionSetfv
  7702. *         ( ULONG,TTDOVertexf * );
  7703. *
  7704. *   FUNCTION
  7705. *    The position of the light source will be set to the values passed by the
  7706. *    vertex structure.
  7707. *   INPUTS
  7708. *     meshhandle      - A valid handle of a mesh.
  7709. *    position        - Pointer to a vertex structure containing the position information.
  7710. *    
  7711. *   RESULT
  7712. *     error - RCNOERROR    if all went well.
  7713. *            RCNOMESH     if the handle is not valid.
  7714. *
  7715. *   EXAMPLE
  7716. *    error = meshLightPositionSetfv(meshhandle,&myvertex);
  7717. *
  7718. *   NOTES
  7719. *    The light will be used by some file formats only,
  7720. *    and for 2D or display functions.
  7721. *
  7722. *   BUGS
  7723. *   SEE ALSO
  7724. *     meshLightPositionGet(),meshLightColorSet()
  7725. *    meshLightColorGet()
  7726. ******************************************************************************
  7727. *
  7728. */
  7729. ULONG __saveds ASM meshLightPositionSetfv(register __d1 ULONG meshhandle,
  7730.                                             register __a0 TTDOVertexf *position) {
  7731.     TTDOMesh        *mesh=NULL;
  7732.     TTDOVertexf    *mposition=NULL;
  7733.  
  7734.     // make a copy of position, a0 is a scratch register
  7735.     mposition=position;
  7736.  
  7737.     mesh=(TTDOMesh *) meshhandle;
  7738.     if(mesh==NULL) return(RCNOMESH);
  7739.     
  7740.     mesh->light.position.x=mposition->x;
  7741.     mesh->light.position.y=mposition->y;
  7742.     mesh->light.position.z=mposition->z;
  7743.     
  7744.     return(RCNOERROR);
  7745. }
  7746.  
  7747. /****** tdo.library/meshLightPositionSet3da ******************************************
  7748. *   NAME    
  7749. *     meshLightPositionSet3da -- Set the light source its position.
  7750. *   SYNOPSIS
  7751. *    error = meshLightPositionSet3da( meshhandle,position )
  7752. *                                     D1          A0
  7753. *
  7754. *    ULONG meshLightPositionSet3da
  7755. *         ( ULONG,TTDODouble [3] );
  7756. *
  7757. *   FUNCTION
  7758. *    The position of the light source will be set to the values passed by the
  7759. *    double array.
  7760. *   INPUTS
  7761. *     meshhandle      - A valid handle of a mesh.
  7762. *    position        - A double array which containis the position information.
  7763. *    
  7764. *   RESULT
  7765. *     error - RCNOERROR    if all went well.
  7766. *            RCNOMESH     if the handle is not valid.
  7767. *
  7768. *   EXAMPLE
  7769. *    error = meshLightPositionSet3da(meshhandle,myvertex);
  7770. *
  7771. *   NOTES
  7772. *    The light will be used by some file formats only,
  7773. *    and for 2D or display functions.
  7774. *
  7775. *   BUGS
  7776. *   SEE ALSO
  7777. *     meshLightPositionGet(),meshLightColorSet()
  7778. *    meshLightColorGet()
  7779. ******************************************************************************
  7780. *
  7781. */
  7782. ULONG __saveds ASM meshLightPositionSet3da(register __d1 ULONG meshhandle,
  7783.                                             register __a0 TTDODouble  position[3]) {
  7784.     TTDOMesh        *mesh=NULL;
  7785.     TTDODouble        *mposition=NULL;
  7786.  
  7787.     // make a copy of position, a0 is a scratch register
  7788.     mposition=position;
  7789.  
  7790.     mesh=(TTDOMesh *) meshhandle;
  7791.     if(mesh==NULL) return(RCNOMESH);
  7792.     
  7793.     mesh->light.position.x=mposition[0];
  7794.     mesh->light.position.y=mposition[1];
  7795.     mesh->light.position.z=mposition[2];
  7796.     
  7797.     return(RCNOERROR);
  7798. }
  7799.  
  7800. /****** tdo.library/meshLightPositionSet3fa ******************************************
  7801. *   NAME    
  7802. *     meshLightPositionSet3fa -- Set the light source its position.
  7803. *   SYNOPSIS
  7804. *    error = meshLightPositionSet3fa( meshhandle,position )
  7805. *                                     D1          A0
  7806. *
  7807. *    ULONG meshLightPositionSet3fa
  7808. *         ( ULONG,TTDOFloat [3] );
  7809. *
  7810. *   FUNCTION
  7811. *    The position of the light source will be set to the values passed by the
  7812. *    float array.
  7813. *   INPUTS
  7814. *     meshhandle      - A valid handle of a mesh.
  7815. *    position        - A float array which containis the position information.
  7816. *    
  7817. *   RESULT
  7818. *     error - RCNOERROR    if all went well.
  7819. *            RCNOMESH     if the handle is not valid.
  7820. *
  7821. *   EXAMPLE
  7822. *    error = meshLightPositionSet3fa(meshhandle,myvertex);
  7823. *
  7824. *   NOTES
  7825. *    The light will be used by some file formats only,
  7826. *    and for 2D or display functions.
  7827. *
  7828. *   BUGS
  7829. *   SEE ALSO
  7830. *     meshLightPositionGet(),meshLightColorSet()
  7831. *    meshLightColorGet()
  7832. ******************************************************************************
  7833. *
  7834. */
  7835. ULONG __saveds ASM meshLightPositionSet3fa(register __d1 ULONG meshhandle,
  7836.                                             register __a0 TTDOFloat  position[3]) {
  7837.     TTDOMesh        *mesh=NULL;
  7838.     TTDOFloat        *mposition=NULL;
  7839.  
  7840.     // make a copy of position, a0 is a scratch register
  7841.     mposition=position;
  7842.  
  7843.     mesh=(TTDOMesh *) meshhandle;
  7844.     if(mesh==NULL) return(RCNOMESH);
  7845.     
  7846.     mesh->light.position.x=mposition[0];
  7847.     mesh->light.position.y=mposition[1];
  7848.     mesh->light.position.z=mposition[2];
  7849.     
  7850.     return(RCNOERROR);
  7851. }
  7852.  
  7853. /****** tdo.library/meshLightPositionGetdv ******************************************
  7854. *   NAME    
  7855. *     meshLightPositionGetdv -- Get the position of the light source.
  7856. *   SYNOPSIS
  7857. *    error = meshLightPositionGetdv( meshhandle,position )
  7858. *                                    D1          A0
  7859. *
  7860. *    ULONG meshLightPositionGetdv
  7861. *         ( ULONG,TTDOVertexd * );
  7862. *
  7863. *   FUNCTION
  7864. *    The position of the light source will be written in the passed vertex structure.
  7865. *   INPUTS
  7866. *     meshhandle      - A valid handle of a mesh.
  7867. *    position        - Pointer to a vertex structure which will contain
  7868. *                      the position information.
  7869. *    
  7870. *   RESULT
  7871. *     error - RCNOERROR    if all went well.
  7872. *            RCNOMESH     if the handle is not valid.
  7873. *
  7874. *   EXAMPLE
  7875. *    error = meshLightPositionGetdv(meshhandle,&myvertex);
  7876. *
  7877. *   NOTES
  7878. *    The light will be used by some file formats only,
  7879. *    and for 2D or display functions.
  7880. *
  7881. *   BUGS
  7882. *   SEE ALSO
  7883. *     meshLightPositionSet(),meshLightColorSet()
  7884. *    meshLightColorGet()
  7885. ******************************************************************************
  7886. *
  7887. */
  7888. ULONG __saveds ASM meshLightPositionGetdv(register __d1 ULONG meshhandle,
  7889.                                             register __a0 TTDOVertexd *position) {
  7890.     TTDOMesh        *mesh=NULL;
  7891.     TTDOVertexd    *mposition=NULL;
  7892.     
  7893.     // make a copy of position, a0 is a scratch register
  7894.     mposition=position;
  7895.   
  7896.     mesh=(TTDOMesh *) meshhandle;
  7897.     if(mesh==NULL) return(RCNOMESH);
  7898.  
  7899.     (*mposition)=mesh->light.position;
  7900.     
  7901.     return(RCNOERROR);
  7902. }
  7903.  
  7904. /****** tdo.library/meshLightPositionGetfv ******************************************
  7905. *   NAME    
  7906. *     meshLightPositionGetfv -- Get the position of the light source.
  7907. *   SYNOPSIS
  7908. *    error = meshLightPositionGetfv( meshhandle,position )
  7909. *                                    D1          A0
  7910. *
  7911. *    ULONG meshLightPositionGetfv
  7912. *         ( ULONG,TTDOVertexf * );
  7913. *
  7914. *   FUNCTION
  7915. *    The position of the light source will be written in the passed vertex structure.
  7916. *   INPUTS
  7917. *     meshhandle      - A valid handle of a mesh.
  7918. *    position        - Pointer to a vertex structure which will contain
  7919. *                      the position information.
  7920. *    
  7921. *   RESULT
  7922. *     error - RCNOERROR    if all went well.
  7923. *            RCNOMESH     if the handle is not valid.
  7924. *
  7925. *   EXAMPLE
  7926. *    error = meshLightPositionGetfv(meshhandle,&myvertex);
  7927. *
  7928. *   NOTES
  7929. *    The light will be used by some file formats only,
  7930. *    and for 2D or display functions.
  7931. *
  7932. *   BUGS
  7933. *   SEE ALSO
  7934. *     meshLightPositionSet(),meshLightColorSet()
  7935. *    meshLightColorGet()
  7936. ******************************************************************************
  7937. *
  7938. */
  7939. ULONG __saveds ASM meshLightPositionGetfv(register __d1 ULONG meshhandle,
  7940.                                             register __a0 TTDOVertexf *position) {
  7941.     TTDOMesh        *mesh=NULL;
  7942.     TTDOVertexf    *mposition=NULL;
  7943.     
  7944.     // make a copy of position, a0 is a scratch register
  7945.     mposition=position;
  7946.   
  7947.     mesh=(TTDOMesh *) meshhandle;
  7948.     if(mesh==NULL) return(RCNOMESH);
  7949.  
  7950.     mposition->x=mesh->light.position.x;
  7951.     mposition->y=mesh->light.position.y;
  7952.     mposition->z=mesh->light.position.z;
  7953.     
  7954.     return(RCNOERROR);
  7955. }
  7956.  
  7957. /****** tdo.library/meshLightPositionGet3da ******************************************
  7958. *   NAME    
  7959. *     meshLightPositionGet3da -- Get the position of the light source.
  7960. *   SYNOPSIS
  7961. *    error = meshLightPositionGet3da( meshhandle,position )
  7962. *                                     D1          A0
  7963. *
  7964. *    ULONG meshLightPositionGet3da
  7965. *         ( ULONG,TTDODouble [3] );
  7966. *
  7967. *   FUNCTION
  7968. *    The position of the light source will be written in the passed double array.
  7969. *   INPUTS
  7970. *     meshhandle      - A valid handle of a mesh.
  7971. *    position        - A double array which will contain
  7972. *                      the position information.
  7973. *    
  7974. *   RESULT
  7975. *     error - RCNOERROR    if all went well.
  7976. *            RCNOMESH     if the handle is not valid.
  7977. *
  7978. *   EXAMPLE
  7979. *    error = meshLightPositionGet3da(meshhandle,myvertex);
  7980. *
  7981. *   NOTES
  7982. *    The light will be used by some file formats only,
  7983. *    and for 2D or display functions.
  7984. *
  7985. *   BUGS
  7986. *   SEE ALSO
  7987. *     meshLightPositionSet(),meshLightColorSet()
  7988. *    meshLightColorGet()
  7989. ******************************************************************************
  7990. *
  7991. */
  7992. ULONG __saveds ASM meshLightPositionGet3da(register __d1 ULONG meshhandle,
  7993.                                             register __a0 TTDODouble position[3]) {
  7994.     TTDOMesh        *mesh=NULL;
  7995.     TTDODouble        *mposition=NULL;
  7996.     
  7997.     // make a copy of position, a0 is a scratch register
  7998.     mposition=position;
  7999.   
  8000.     mesh=(TTDOMesh *) meshhandle;
  8001.     if(mesh==NULL) return(RCNOMESH);
  8002.  
  8003.     mposition[0]=mesh->light.position.x;
  8004.     mposition[1]=mesh->light.position.y;
  8005.     mposition[2]=mesh->light.position.z;
  8006.     
  8007.     return(RCNOERROR);
  8008. }
  8009.  
  8010. /****** tdo.library/meshLightPositionGet3fa ******************************************
  8011. *   NAME    
  8012. *     meshLightPositionGet3fa -- Get the position of the light source.
  8013. *   SYNOPSIS
  8014. *    error = meshLightPositionGet3fa( meshhandle,position )
  8015. *                                     D1          A0
  8016. *
  8017. *    ULONG meshLightPositionGet3fa
  8018. *         ( ULONG,TTDOFloat [3] );
  8019. *
  8020. *   FUNCTION
  8021. *    The position of the light source will be written in the passed float array.
  8022. *   INPUTS
  8023. *     meshhandle      - A valid handle of a mesh.
  8024. *    position        - A float array which will contain
  8025. *                      the position information.
  8026. *    
  8027. *   RESULT
  8028. *     error - RCNOERROR    if all went well.
  8029. *            RCNOMESH     if the handle is not valid.
  8030. *
  8031. *   EXAMPLE
  8032. *    error = meshLightPositionGet3fa(meshhandle,myvertex);
  8033. *
  8034. *   NOTES
  8035. *    The light will be used by some file formats only,
  8036. *    and for 2D or display functions.
  8037. *
  8038. *   BUGS
  8039. *   SEE ALSO
  8040. *     meshLightPositionSet(),meshLightColorSet()
  8041. *    meshLightColorGet()
  8042. ******************************************************************************
  8043. *
  8044. */
  8045. ULONG __saveds ASM meshLightPositionGet3fa(register __d1 ULONG meshhandle,
  8046.                                             register __a0 TTDOFloat position[3]) {
  8047.     TTDOMesh        *mesh=NULL;
  8048.     TTDOFloat        *mposition=NULL;
  8049.     
  8050.     // make a copy of position, a0 is a scratch register
  8051.     mposition=position;
  8052.   
  8053.     mesh=(TTDOMesh *) meshhandle;
  8054.     if(mesh==NULL) return(RCNOMESH);
  8055.  
  8056.     mposition[0]=mesh->light.position.x;
  8057.     mposition[1]=mesh->light.position.y;
  8058.     mposition[2]=mesh->light.position.z;
  8059.     
  8060.     return(RCNOERROR);
  8061. }
  8062.  
  8063. /****** tdo.library/meshLightColorSetubc ******************************************
  8064. *   NAME    
  8065. *     meshLightColorSetubc -- Set the light source its color.
  8066. *   SYNOPSIS
  8067. *    error = meshLightColorSetubc( meshhandle,color )
  8068. *                                  D1          A0
  8069. *
  8070. *    ULONG meshLightColorSetubc
  8071. *         ( ULONG,TTDOColorub * );
  8072. *
  8073. *   FUNCTION
  8074. *    The color of the light source will be set to the values passed by the
  8075. *    color structure.
  8076. *   INPUTS
  8077. *     meshhandle      - A valid handle of a mesh.
  8078. *    color           - Pointer to a color structure containing the color information.
  8079. *    
  8080. *   RESULT
  8081. *     error - RCNOERROR    if all went well.
  8082. *            RCNOMESH     if the handle is not valid.
  8083. *
  8084. *   EXAMPLE
  8085. *    error = meshLightColorSetubc(meshhandle,&mycolor);
  8086. *
  8087. *   NOTES
  8088. *    The light will be used by some file formats only,
  8089. *    and for 2D or display functions.
  8090. *
  8091. *   BUGS
  8092. *   SEE ALSO
  8093. *     meshLightColorGet(),meshLightPositionSet()
  8094. *    meshLightPositionGet()
  8095. ******************************************************************************
  8096. *
  8097. */
  8098. ULONG __saveds ASM meshLightColorSetubc(register __d1 ULONG meshhandle,
  8099.                                          register __a0 TTDOColorub *color) {
  8100.     TTDOMesh        *mesh=NULL;
  8101.     TTDOColorub    *mcolor=NULL;
  8102.     
  8103.     // make a copy of color, a0 is a scratch register
  8104.     mcolor=color;
  8105.   
  8106.     mesh=(TTDOMesh *) meshhandle;
  8107.     if(mesh==NULL) return(RCNOMESH);
  8108.     
  8109.     mesh->light.color=(*mcolor);
  8110.  
  8111.     return(RCNOERROR);
  8112. }
  8113.  
  8114. /****** tdo.library/meshLightColorGetubc ******************************************
  8115. *   NAME    
  8116. *     meshLightColorGetubc -- Get the color of the light source.
  8117. *   SYNOPSIS
  8118. *    error = meshLightColorGetubc( meshhandle,color )
  8119. *                                  D1          A0
  8120. *
  8121. *    ULONG meshLightColorGetubc
  8122. *         ( ULONG,TTDOColorub * );
  8123. *
  8124. *   FUNCTION
  8125. *    The color of the light source will be written in the passed color structure.
  8126. *   INPUTS
  8127. *     meshhandle      - A valid handle of a mesh.
  8128. *    color           - Pointer to a color structure which will contain
  8129. *                      the color information.
  8130. *    
  8131. *   RESULT
  8132. *     error - RCNOERROR    if all went well.
  8133. *            RCNOMESH     if the handle is not valid.
  8134. *
  8135. *   EXAMPLE
  8136. *    error = meshLightColorGetubc(meshhandle,&mycolor);
  8137. *
  8138. *   NOTES
  8139. *    The light will be used by some file formats only,
  8140. *    and for 2D or display functions.
  8141. *
  8142. *   BUGS
  8143. *   SEE ALSO
  8144. *     meshLightColorSet(),meshLightPositionSet()
  8145. *    meshLightPositionGet()
  8146. ******************************************************************************
  8147. *
  8148. */
  8149. ULONG __saveds ASM meshLightColorGetubc(register __d1 ULONG meshhandle,
  8150.                                         register __a0 TTDOColorub *color) {
  8151.     TTDOMesh        *mesh=NULL;
  8152.     TTDOColorub    *mcolor=NULL;
  8153.     
  8154.     // make a copy of color, a0 is a scratch register
  8155.     mcolor=color;
  8156.  
  8157.     mesh=(TTDOMesh *) meshhandle;
  8158.     if(mesh==NULL) return(RCNOMESH);
  8159.  
  8160.     (*color)=mesh->light.color;
  8161.     
  8162.     return(RCNOERROR);
  8163. }
  8164.  
  8165. /****** tdo.library/meshBoundingBoxGetd ******************************************
  8166. *   NAME    
  8167. *     meshBoundingBoxGetd -- Get the bounding box of the mesh.
  8168. *   SYNOPSIS
  8169. *    error = meshBoundingBoxGetd( meshhandle,bbox )
  8170. *                                 D1          A0
  8171. *
  8172. *    ULONG meshBoundingBoxGetd
  8173. *         ( ULONG,TTDOBBoxd * );
  8174. *
  8175. *   FUNCTION
  8176. *    The bounding box of the mesh will be written in the passed BBox structure.
  8177. *   INPUTS
  8178. *     meshhandle      - A valid handle of a mesh.
  8179. *    bbox            - Pointer to a bbox structure which will contain
  8180. *                      the bounding box informations.
  8181. *    
  8182. *   RESULT
  8183. *     error - RCNOERROR    if all went well.
  8184. *            RCNOMESH     if the handle is not valid.
  8185. *
  8186. *   EXAMPLE
  8187. *    error = meshBoundingBoxGetd(meshhandle,&mybbox);
  8188. *
  8189. *   NOTES
  8190. *
  8191. *   BUGS
  8192. *   SEE ALSO
  8193. ******************************************************************************
  8194. *
  8195. */
  8196. ULONG __saveds ASM meshBoundingBoxGetd(register __d1 ULONG meshhandle,
  8197.                                         register __a0 TTDOBBoxd *bbox) {
  8198.     TTDOMesh        *mesh=NULL;
  8199.     TTDOBBoxd        *mbbox=NULL;
  8200.     
  8201.     // make a copy of bbox, a0 is a scratch register
  8202.     mbbox=bbox;
  8203.   
  8204.     mesh=(TTDOMesh *) meshhandle;
  8205.     if(mesh==NULL) return(RCNOMESH);
  8206.  
  8207.     (*mbbox)=mesh->bBox;
  8208.     
  8209.     return(RCNOERROR);
  8210. }
  8211.  
  8212. /****** tdo.library/meshBoundingBoxGetf ******************************************
  8213. *   NAME    
  8214. *     meshBoundingBoxGetf -- Get the bounding box of the mesh.
  8215. *   SYNOPSIS
  8216. *    error = meshBoundingBoxGetf( meshhandle,bbox )
  8217. *                                 D1          A0
  8218. *
  8219. *    ULONG meshBoundingBoxGetf
  8220. *         ( ULONG,TTDOBBoxf * );
  8221. *
  8222. *   FUNCTION
  8223. *    The bounding box of the mesh will be written in the passed BBox structure.
  8224. *   INPUTS
  8225. *     meshhandle      - A valid handle of a mesh.
  8226. *    bbox            - Pointer to a bbox structure which will contain
  8227. *                      the bounding box informations.
  8228. *    
  8229. *   RESULT
  8230. *     error - RCNOERROR    if all went well.
  8231. *            RCNOMESH     if the handle is not valid.
  8232. *
  8233. *   EXAMPLE
  8234. *    error = meshBoundingBoxGetf(meshhandle,&mybbox);
  8235. *
  8236. *   NOTES
  8237. *
  8238. *   BUGS
  8239. *   SEE ALSO
  8240. ******************************************************************************
  8241. *
  8242. */
  8243. ULONG __saveds ASM meshBoundingBoxGetf(register __d1 ULONG meshhandle,
  8244.                                         register __a0 TTDOBBoxf *bbox) {
  8245.     TTDOMesh        *mesh=NULL;
  8246.     TTDOBBoxf        *mbbox=NULL;
  8247.     
  8248.     // make a copy of bbox, a0 is a scratch register
  8249.     mbbox=bbox;
  8250.   
  8251.     mesh=(TTDOMesh *) meshhandle;
  8252.     if(mesh==NULL) return(RCNOMESH);
  8253.  
  8254.     mbbox->front=mesh->bBox.front;
  8255.     mbbox->rear=mesh->bBox.rear;
  8256.     mbbox->left=mesh->bBox.left;
  8257.     mbbox->right=mesh->bBox.right;
  8258.     mbbox->top=mesh->bBox.top;
  8259.     mbbox->bottom=mesh->bBox.bottom;
  8260.  
  8261.     return(RCNOERROR);
  8262. }
  8263.  
  8264. /****** tdo.library/meshSave3D ******************************************
  8265. *   NAME    
  8266. *     meshSave3D -- Saves the mesh as 3D file..
  8267. *
  8268. *   SYNOPSIS
  8269. *    error = meshSave3D( meshhandle,formatname,filename,screen )
  8270. *                        D1         D2         D3        A0
  8271. *
  8272. *    ULONG meshSave3D
  8273. *         ( ULONG,STRPTR,STRPTR,struct Screen * );
  8274. *
  8275. *   FUNCTION
  8276. *    The mesh will be saved in the specified 3d file format.
  8277. *   INPUTS
  8278. *     meshhandle  - A valid handle of a mesh.
  8279. *    formatname  - A valid 3D saver name, which specifies the output format.
  8280. *    filename    - Name and path of the file.
  8281. *    screen      - The screen of the caller, or NULL if no one or no options.
  8282. *    
  8283. *   RESULT
  8284. *    error - RCNOERROR            if all went well.
  8285. *            RCNOMESH             if the handle is not valid.
  8286. *            RCUNKNOWNFORMAT      if the file format is not known.
  8287. *            RCSAVEROPEN          if the saver library could not be opened.
  8288. *            tdo3X errors         if an error occured in the extension module.
  8289. *            IoErr()              if possible to catch it, you will get its codes.
  8290. *
  8291. *   EXAMPLE
  8292. *    error = meshSave3D(meshhandle,formatname,"ram:test",NULL);
  8293. *
  8294. *   NOTES
  8295. *    No file existence tests are made here! Existent files will be overwritten.
  8296. *
  8297. *   BUGS
  8298. *   SEE ALSO
  8299. *    meshLoad3D(),meshSave2D(),
  8300. *    meshLoad2D()
  8301. ******************************************************************************
  8302. *
  8303. */
  8304. ULONG __saveds ASM meshSave3D(register __d1 ULONG meshhandle,
  8305.                                 register __d2 STRPTR formatname,
  8306.                                 register __d3 STRPTR filename,
  8307.                                 register __a0 struct Screen *screen) {
  8308.     TTDOMesh        *mesh;
  8309.     ULONG            mmeshhandle;
  8310.     struct Screen    *mscreen;
  8311.     ULONG            retcode=RCNOERROR;
  8312.     UBYTE            i;
  8313.  
  8314.     // make a copy of screen, a0 is a scratch register
  8315.     mmeshhandle=meshhandle;
  8316.  
  8317.     // make a copy of screen, a0 is a scratch register
  8318.     mscreen=screen;
  8319.     
  8320.     mesh = (TTDOMesh *) meshhandle;
  8321.     if(mesh==NULL) return(RCNOMESH);    
  8322.  
  8323.     /*
  8324.     ** Check if the filetype is valid
  8325.     */
  8326.     if(c3dsNames==NULL) return(RCUNKNOWNFORMAT);
  8327.     i=0;
  8328.     while(c3dsNames[i]!=NULL && strcmp(c3dsNames[i],formatname)!=0) {i++};
  8329.     if(c3dsNames[i]==NULL) return(RCUNKNOWNFORMAT);
  8330.     
  8331.     /*
  8332.     ** If no camera and light position was given, set it to default now
  8333.     */
  8334.     if (!(mesh->camera.position.x &&
  8335.          mesh->camera.position.y &&
  8336.          mesh->camera.position.z &&
  8337.          mesh->camera.lookat.x &&
  8338.          mesh->camera.lookat.y &&
  8339.          mesh->camera.lookat.z &&
  8340.          mesh->light.position.x &&
  8341.          mesh->light.position.y &&
  8342.          mesh->light.position.z)) setCameraLight(mesh);
  8343.  
  8344.     /*
  8345.     ** Open the output library and write the mesh
  8346.     */
  8347.     if((x3Base=(APTR) OpenLibrary(c3dsLib[i],0))==NULL) {
  8348.         return(RCSAVEROPEN);
  8349.     }
  8350.  
  8351.     retcode=tdo3XSave(mmeshhandle,filename,NULL);
  8352.  
  8353.     CloseLibrary((APTR)x3Base);
  8354.  
  8355.     return(RCNOERROR);
  8356. }
  8357.  
  8358. /****** tdo.library/meshLoad3D ******************************************
  8359. *   NAME    
  8360. *     meshLoad3D -- Loads a 3D file into a mesh.
  8361. *
  8362. *   SYNOPSIS
  8363. *    error = meshLoad3D( meshhandle,filename,erroffset,screen )
  8364. *                        D1         D3       D4         A0
  8365. *
  8366. *    ULONG meshLoad3D
  8367. *         ( ULONG *,STRPTR,struct Screen * );
  8368. *
  8369. *   FUNCTION
  8370. *    A new mesh will be created and filled up with the data
  8371. *    found in the 3D file.
  8372. *   INPUTS
  8373. *     meshhandle  - Pointer which will contain the new mesh.
  8374. *    filename    - Name and path of the file.
  8375. *    erroffset   - Offset in lines or bytes where an error occured.
  8376. *    screen      - The screen of the caller, or NULL if no one or no options.
  8377. *    
  8378. *   RESULT
  8379. *    error - RCNOERROR            if all went well.
  8380. *            RCNOMESH             if no new mesh could be created.
  8381. *            RCUNKNOWNFORMAT      if the file format is not known.
  8382. *            RCLOADEROPEN         if a loader library could not be opened.
  8383. *            tdo3X errors         if an error occured in the extension module.
  8384. *            IoErr()              if possible to catch it, you will get its codes.
  8385. *
  8386. *   EXAMPLE
  8387. *    error = meshLoad3D(&meshhandle,"ram:test",NULL);
  8388. *
  8389. *   NOTES
  8390. *
  8391. *   BUGS
  8392. *   SEE ALSO
  8393. *    meshSave3D(),meshSave2D(),
  8394. *    meshLoad2D()
  8395. ******************************************************************************
  8396. *
  8397. */
  8398. ULONG __saveds ASM meshLoad3D(register __d1 ULONG *meshhandle,
  8399.                                 register __d3 STRPTR filename,
  8400.                                 register __d4 ULONG *erroffset,
  8401.                                 register __a0 struct Screen *screen) {
  8402.     ULONG            *mmeshhandle;
  8403.     struct Screen    *mscreen;
  8404.     ULONG            retcode=RCNOERROR;
  8405.     UBYTE            i;
  8406.  
  8407.     // make a copy of meshhandle, d1 is a scratch register
  8408.     mmeshhandle=meshhandle;
  8409.  
  8410.     // make a copy of screen, a0 is a scratch register
  8411.     mscreen=screen;
  8412.  
  8413.     // check if the input file can be recognized by someone
  8414.     if(c3dlNames==NULL) return(RCUNKNOWNFORMAT);
  8415.     i=0;
  8416.     retcode=RCNOERROR+1;
  8417.     while(c3dlLib[i]!=NULL && retcode!=RCNOERROR) {
  8418.         if((x3Base=(APTR) OpenLibrary(c3dlLib[i],0))==NULL) {
  8419.             return(RCLOADEROPEN);
  8420.         }
  8421.  
  8422.         retcode=tdo3XCheckFile(filename);
  8423.  
  8424.         // close the library if it is the false one, and increment i
  8425.         if(retcode!=RCNOERROR) {
  8426.             CloseLibrary((APTR)x3Base);
  8427.             i++;
  8428.         }
  8429.     };
  8430.     
  8431.     // did we find something ?
  8432.     if(retcode!=RCNOERROR) {
  8433.         CloseLibrary((APTR)x3Base);
  8434.         return(retcode);
  8435.     }
  8436.  
  8437.     // create a new mesh
  8438. //    if(((*mmeshhandle)=meshNew())==0) {
  8439. //        CloseLibrary((APTR)x3Base);
  8440. //        return(RCNOMESH);
  8441. //    }
  8442.     
  8443.     retcode=tdo3XLoad((*mmeshhandle),filename,erroffset,mscreen);
  8444.  
  8445.     // in error case, delete the mesh
  8446.     if(retcode!=RCNOERROR) {
  8447. //        meshDelete((*mmeshhandle));
  8448.         (*meshhandle)=0;
  8449.     }
  8450.  
  8451.     CloseLibrary((APTR)x3Base);
  8452.  
  8453.     return(retcode);
  8454. }
  8455.  
  8456.  
  8457. /*
  8458. ULONG __saveds ASM tdogetcur(register __a6 struct tdoBase *tdoBase) {
  8459.  return(tdoBase->tdb_current);
  8460. }
  8461. */
  8462.  
  8463.  
  8464. /*
  8465. TODO
  8466.  
  8467. Lightwave,Imagine,Videoscape  groessen/anzahl checks fertigmachen !!
  8468.  
  8469. Material mehr parameter, brechungsindex, reflektion, ...
  8470.  
  8471. */
  8472.  
  8473. /************************* End of file ******************************/
  8474.  
  8475.